google-cloud-storage - 使用 S3 Java SDK 上传到 GCS:`您在 Content-MD5 或 x-goog-hash 中指定的 MD5 与我们计算的不匹配`
问题描述
我正在尝试使用 AWS SDK For Java 1.x 上传到 Google Cloud Storage。我已启用互操作性模式并将其放入AWS_ACCESS_KEY_ID
环境AWS_SECRET_ACCESS_KEY
中。我可以列出对象,但上传对我不起作用。
我正在使用的代码是
AmazonS3 client =
AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration(
"http://storage.googleapis.com", "auto"))
.build();
TransferManager tm = TransferManagerBuilder.standard()
.withS3Client(client)
.build();
Upload upload = tm.upload(bucketName, key, new File(filename));
upload.waitForCompletion();
但我得到的结果是:
com.amazonaws.services.s3.model.AmazonS3Exception: The MD5 you specified in Content-MD5 or x-goog-hash did not match what we computed. (Service: Amazon S3; Status Code: 400; Error Code: BadDigest; Request ID: null; S3 Extended Request ID: null; Proxy: null), S3 Extended Request ID: null
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1819)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1403)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1372)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1145)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:802)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:770)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:744)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:704)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:686)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:550)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:530)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5437)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5384)
相同的代码适用于 S3(减去 EndpointConfiguration)
解决方案
GCS 文档说:
在 Cloud Storage XML API 中,分块传输编码和 V4 签名目前不能同时使用。一些 Amazon S3 工具默认使用分块传输编码和签名;在这种情况下,您应该禁用分块传输编码。
我找到了两种解决此错误的方法
您可以
.withChunkedEncodingDisabled(true)
在构建客户端时:AmazonS3 client = AmazonS3ClientBuilder.standard() .withChunkedEncodingDisabled(true) // <<<<<<< .withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration( "http://storage.googleapis.com", "auto")) .build();
您可以切换到 https 端点:
AmazonS3 client = AmazonS3ClientBuilder.standard() .withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration( "https://storage.googleapis.com", "auto")) .build();
推荐阅读
- ruby-on-rails - 我们如何在 Ruby on Rails 中使用 UNION ALL 和 ORM 查询?
- rust - 文档是否提到在函数参数前添加“mut”关键字的可能性?
- python - Python - 应用带有 if 条件的 lambda
- python - 尝试 pip install mysql-python 时命令“gcc”失败
- django - 在 circleci 2.0 中构建项目时出现 apturl==0.5.2 丢失错误
- javascript - 如果我不使用 Ajax - MVC 选择任何内容,如何避免下拉列表不修改数据
- javascript - 输入类型日期以设置从数据库中获取的日期
- microsoft-teams - Office365 连接到 Office 按钮不适用于 Microsoft Teams。收到 500 错误
- git - `git pull --rebase` 如何正确拉取修改后的提交?
- android - 有什么方法可以删除 AlertDialog 的背景?