【问题标题】:Insert object (as a folder) in Google Cloud Storage using JSON API with Java使用带有 Java 的 JSON API 在 Google Cloud Storage 中插入对象(作为文件夹)
【发布时间】:2014-07-23 10:55:29
【问题描述】:

我已经知道 Google Cloud Storage 中没有文件夹(它们被视为对象),所以请看一下我的问题,您就会明白我的意思。谢谢:-)

这是我上传对象的方法,在我的具体情况下,我想上传一个“文件夹”,即以“/”结尾的文件(例如:“newfolder/”),但我在我的代码末尾的 execute() 中收到 GoogleJson 错误。

[错误]:

Uncaught exception from servlet
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 OK
{
  "code" : 400,
  "errors" : [ {
    "domain" : "global",
    "message" : "Required",
    "reason" : "required"
  }, {
    "domain" : "global",
    "message" : "Required",
    "reason" : "required"
  }, {
    "domain" : "global",
    "message" : "Required",
    "reason" : "required"
  } ],
  "message" : "Required"
}

[我的方法里面的代码]:

StorageObject objectMetadata = null;

        //default bucket
        String bucketRootName = “defaultbucketname”;

        //First Folder
        String folderAppName = “myfolder”;

        //folder that i want to create (upload)
        folderName+="/";
        String folderPath = folderAppName + "/" + folderName;

        if (useCustomMetadata) {

            List<ObjectAccessControl> acl = Lists.newArrayList();
            acl.add( new ObjectAccessControl().setEntity("allAuthenticatedUsers").setRole("OWNER"));

            objectMetadata = new StorageObject()

            .setName(folderPath)
            .setAcl(acl)
            .setContentDisposition("attachment");
        }

        Storage.Objects.Insert insertObject = storage.objects().insert(bucketRootName, objectMetadata);

        StorageObject metadata = insertObject.execute();
        return metadata;

为了有这样一个路径的存储桶: 默认bucketname/myfolder/folderName/

有人知道怎么解决吗?

非常感谢

【问题讨论】:

  • 你不只是上传路径为“文件夹内”的新文件。我不认为你可以像这样上传一个空的“文件夹”,它只是所有的虚拟路径。

标签: java json google-app-engine google-cloud-storage cloud-storage


【解决方案1】:

上传的对象必须有一个 Content-Type,即使它们是零字节大。

另外,我很确定您必须上传一个实际文件,即使它的大小为零字节。

【讨论】:

  • 您建议使用哪种内容类型?
  • Google Developers Console 浏览器在插入文件夹对象时使用“text/plain”。
【解决方案2】:

我认为您不能那样创建文件夹。但是你可以在上传文件时通过设置名称来创建它。

例如如果你想在 foldA/foldB/test.txt 下创建一个文件,你可以按照以下方式进行。

    InputStream is = Files.newInputStream(path); //path if java.nio.file.Path
    String mimeType = Files.probeContentType(path);
    InputStreamContent isContent = new InputStreamContent(mimeType, is);
    StorageObject objectMetadata = new StorageObject();

    Storage.Objects.Insert insertObject = storage.objects().insert(bucketRootName, objectMetadata,isContent);

    insertObject.setName("foldA/foldB/"+path.getFileName().toString()); // path.getFileName().toString() will give u test.txt
    insertObject.execute();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 2019-01-13
    • 2015-01-07
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多