Tag: google cloud storage

如何在okhttp中将Charset自动添加到Content-Type中

请考虑以下代码: OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse(“text/plain; charset=utf-8”); // [A] RequestBody body = RequestBody.create(mediaType, media); String[] aclHeader = “x-goog-acl:public-read”.split(“:”); Request request = new Request.Builder() .addHeader(“Content-Type”, “text/plain”) // [B] .addHeader(aclHeader[0], aclHeader[1]) .url(url) .put(body) .build(); Response response = client.newCall(request).execute(); 我正在从客户端访问GCS,并使用以前签名的URL。 问题:似乎okhttp将为身体[A]声明的字符集添加到URL(至少对于text / plain),即使它未在[B]中声明。 这会弄乱我签名的URL,GCS会返回403 Forbidden。 如果我从[A]中删除字符集,它仍会被添加。 如果我在签名之前将charset添加到签名的URL,它就可以工作,GCS返回200 OK。 但这不是应该的。 至少在使用签名URL时,必须将这些URL完全按照声明的方式发送到服务器。 我尝试使用Apache http客户端(我不想在生产中使用,因为okhttpclient已经是我的安装的一部分)并且该客户端不会暴露这种行为: String[] aclHeader […]

带有Java服务帐户的Google云端存储 – 403 Caller没有对存储桶的storage.objects.list访问权限

我们希望从我们的应用服务器中的Google Storage下载文件。 重要的是对单个存储桶具有只读受限访问权限,而不是其他任何内容。 起初我使用了一个常规用户帐户(不是服务帐户),它有权访问我们的Google Cloud项目中的所有存储桶,一切正常 – 我的Java代码打开存储桶并下载文件没有问题。 Storage storage = StorageOptions.getDefaultInstance().getService(); Bucket b = storage.get( “mybucketname” ); 然后我想切换到使用专门创建的服务帐户,该帐户只能访问一个存储桶。 所以我创建了一个服务帐户,授予读取单个存储桶的权限,并下载了其密钥文件。 Google Cloud Console中的权限命名为: 存储对象查看器(3个成员)读取对GCS对象的访问权限。 gsutil命令行实用程序可以正常使用此帐户 – 从命令行可以访问此存储桶但不能访问其他存储桶。 使用以下命令从命令行初始化: gcloud –project myprojectname auth activate-service-account files-viewer2@myprojectname.iam.gserviceaccount.com –key-file=/…/keyfilename.json 我甚至尝试了两个可以访问不同存储桶的不同服务帐户,从命令行我可以在它们之间切换,gsutil只能访问相关的存储桶,而对于任何其他存储器,它会返回错误: “AccessDeniedException:403 Caller没有对bucket xxxxxxxxxx的storage.objects.list访问权限。” 所以,从命令行一切正常。 但在Java中,身份validation存在一些问题。 我以前与常规用户帐户一起使用的默认身份validation停止工作 – 它报告错误: com.google.cloud.storage.StorageException:匿名用户没有对bucket xxxxxxxxxx的storage.buckets.get访问权限。 然后我尝试了以下代码(这是最简单的变体,因为它依赖于关键的json文件,但我已经尝试了在各种论坛中找到的许多其他变体,但没有成功): FileInputStream fis = new FileInputStream( “/path/to/the/key-file.json” ); ServiceAccountCredentials credentials […]

使用Google云端存储从Firebase存储中删除文件夹

我想删除文件夹“test”及其中的所有内容。 我很幸运能够使用以下代码在终端中删除FirebaseStorage中的文件夹及其所有内容/子文件夹: gsutil rm -r gs://bucketname.appspot.com/test/** 但是,当我尝试在java中执行此操作时,它不起作用。 Storage storage = StorageOptions.getDefaultInstance().getService(); String bucketName = “bucketname.appspot.com/test”; Bucket bucket = storage.get(bucketName); bucket.delete(Bucket.BucketSourceOption.metagenerationMatch()); 它抛出了这个exception: Exception in thread “FirebaseDatabaseEventTarget” com.google.cloud.storage.StorageException: Invalid bucket name: ‘bucketname.appspot.com/test’ at com.google.cloud.storage.spi.DefaultStorageRpc.translate(DefaultStorageRpc.java:202) at com.google.cloud.storage.spi.DefaultStorageRpc.get(DefaultStorageRpc.java:322) at com.google.cloud.storage.StorageImpl$4.call(StorageImpl.java:164) at com.google.cloud.storage.StorageImpl$4.call(StorageImpl.java:161) at com.google.cloud.RetryHelper.doRetry(RetryHelper.java:179) at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:244) at com.google.cloud.storage.StorageImpl.get(StorageImpl.java:160) at xxx.backend.server_request.GroupRequestManager.deleteGroupStorage(GroupRequestManager.java:119) at xxx.backend.server_request.GroupRequestManager.deleteGroup(GroupRequestManager.java:26) at xxx.backend.server_request.ServerRequestListener.onChildAdded(ServerRequestListener.java:27) at com.google.firebase.database.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:65) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:49) at […]