将文件上传到 Google Cloud Storage (Java)

man*_*sta 6 java cloud google-app-engine google-cloud-storage google-cloud-platform

基本上,问题在于标题:我不知道如何将文件上传到 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");
Run Code Online (Sandbox Code Playgroud)

bucket上面的对象可以从storageobject接收,这才是问题的根源

在到目前为止我看到的所有教程中(特别是在这个教程中: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();
Run Code Online (Sandbox Code Playgroud)

这样创建一个存储对象后,我们可能会得到一个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();
Run Code Online (Sandbox Code Playgroud)

但是我不能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);
Run Code Online (Sandbox Code Playgroud)

对我来说剩下的一个微妙点是以下几行:

Page<Bucket> buckets = storage.list();
Run Code Online (Sandbox Code Playgroud)

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

小智 7

我能够使用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");
}
Run Code Online (Sandbox Code Playgroud)

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