java - 将文件上传到 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.Storage
,com.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)
?
解决方案
我能够使用从文档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'
推荐阅读
- excel - 将小数四舍五入为整数
- amazon-web-services - 如何向 Amazon.EC2.Model.AddPrefixListEntry 添加多个条目?
- flutter - Flutter sqflite中的where子句
- youtube-analytics-api - 为什么subscribersGained -subscribersLost 与我当前的订阅人数不同?
- javascript - 将 HTML 项动态添加到上一项的右侧而不是下方
- laravel - 尝试链接我的按钮时未定义 Laravel 路由
- r - map_dfr to bind_rows 全局环境中的所有数据框
- c# - 使用 Installer Project 创建 MSI,安装项目后软件无法启动
- c++ - 推回二维向量的数据
- java - 无法让 MapStruct 与 Enum Inheritance 和 @TargetTytpe 一起使用