首页 > 解决方案 > 将文件上传到 Google Cloud Storage (Java)

问题描述

基本上,问题出在标题中:我无法弄清楚如何将文件上传到 Google Storage

我检查了这个网页:
https ://cloud.google.com/storage/docs/uploading-objects

这两行建议用于 Java 语言选项卡中的“上传对象”:

InputStream content = new ByteArrayInputStream("Hello, World!".getBytes(UTF_8));
Blob blob = bucket.create(blobName, content, "text/plain");

上面的bucket对象可以从storage对象接收,这实际上是问题的根源

在我到目前为止看到的所有教程中(特别是在这个:https ://support.google.com/dfp_premium/answer/1733127?hl=en )中,storage属于com.google.api.services.storage.Storage而不是com.google.cloud.storage.Storage,并且实例化如下:

        httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JacksonFactory.getDefaultInstance())
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountScopes(
                Collections.singleton(STORAGE_SCOPE))
            .setServiceAccountPrivateKeyFromP12File(p12File).build();

        storage = new com.google.api.services.storage.Storage.Builder(httpTransport,
            JacksonFactory.getDefaultInstance(), credential)
            .setApplicationName(PROJECT_NAME).build();

这样创建存储对象后,我们可以得到一个bucket对象,如下:

    com.google.api.services.storage.Storage.Buckets.Get object = storage.buckets().get(BUCKET_NAME);        
    com.google.api.services.storage.model.Bucket bucket = object.execute();

但是我不能com.google.api.services.storage.model.Bucket用于上传文件,因为它没有create()上面提到的方法。我需要com.google.cloud.storage.Bucket改用。

我也检查了这个 stackoverflow 问题:Upload image to Google Cloud Storage (Java)
和提供的链接中的示例确实使用com.google.cloud.storage.Storagecom.google.cloud.storage.Bucket但它们从未显示如何传递凭据并实例化storage类似于上面的代码的对象。

有人可以提供一个清晰而全面的 Java 代码片段,展示如何将文件上传到 Google Cloud Storage,包括所有必要的storage对象凭据实例化吗?

编辑。换句话说,我需要自定义com.google.cloud.storage.Storage上面的实例化,而不是使用这一行:Storage storage = StorageOptions.getDefaultInstance().getService();

编辑2。最后,我现在可以在通过以下代码检索存储桶后上传文件:

GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(KEY_JSN)).createScoped(Lists.newArrayList("https://www.googleapis.com/auth/devstorage.read_write"));

Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

Bucket bucket = storage.get(BUCKET_NAME);

留给我的一个微妙点是以下行:

Page<Bucket> buckets = storage.list();

返回一个空列表。接收一个空的桶列表同时能够接收特定的桶元数据是否有意义get(bucket_name)

标签: javagoogle-app-enginegoogle-cloud-platformcloudgoogle-cloud-storage

解决方案


我能够使用从文档com.google.cloud.storage派生的以下片段中的库创建并上传到存储桶:

public void createBlobFromByteArray(String blobName, String jsonPath, String bucketName) throws IOException {
  GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath)).createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));

  Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

  Bucket bucket = storage.create(BucketInfo.of(bucketName));

  Blob blob = bucket.create(blobName, "Hello, World!".getBytes(UTF_8), "text/plain");
}

您需要创建一个 JSON 服务帐户密钥并从 Google Cloud 控制台下载它。然后在GoogleCredentials方法中传递它进行身份验证'storage'


推荐阅读