java - 当 `PutObjectRequest`的userMetaData中有中文字符时AWS S3错误

标签 java amazon-s3 aws-sdk

如果我的 PutObjectRequestuserMetaData 值中有中文字符:

enter image description here

我会收到 400 错误请求:

com.amazonaws.services.s3.model.AmazonS3Exception: Bad Request (Service: Amazon S3; Status Code: 400; Error Code: 400 Bad Request; Request ID: null; S3 Extended Request ID: null)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1587)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1257)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1029)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:741)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:715)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:697)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:665)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:647)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:511)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4227)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4174)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1722)

下面是不同汉字的:

enter image description here

导致 403 错误:

com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Request ID: 1C11613460118BAE; S3 Extended Request ID: 6iq+ertFiYjXgJJhKWTFr6qhSenkwqk3OOp05xYaIlp6jrlsWJK8PQhoGSiWYAu2CFbLK5X5zEw=)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1587)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1257)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1029)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:741)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:715)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:697)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:665)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:647)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:511)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4227)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4174)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1722)

请注意,如果 userMetaData 中没有中文字符,则一切正常。

我的 AWS 开发工具包版本是 1.11.177

最佳答案

这不是一个可报告的错误...它是 S3 REST 接口(interface)中记录的限制。

User-defined metadata is a set of key-value pairs. Amazon S3 stores user-defined metadata keys in lowercase. Each key-value pair must conform to US-ASCII when using REST and UTF-8 when using SOAP or browser-based uploads via POST. (Emphasis added.)

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-metadata

SOAP 已被弃用(更不用说糟糕了),尽管 POST 上传允许您在元数据中存储 UTF-8 字符,但不要这样做,因为您可能无法使用该对象或读回该对象元数据。

与对象元数据相比,对象标记确实支持UTF-8。

A tag key can be up to 128 Unicode characters in length and tag values can be up to 256 Unicode characters in length.

http://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html

关于java - 当 `PutObjectRequest`的userMetaData中有中文字符时AWS S3错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45734959/

相关文章:

java - Android Parcel.obtain() 返回空值?

amazon-web-services - 如何在 AWS SAM 模板中限制对 S3 存储桶的公共(public)访问

amazon-web-services - 跳过 S3 生命周期策略中的某些文件夹

java - 从略微偏离的 double 创建正确的 BigDecimals

java - 将对象从 servlet 传递到另一个 servlet

amazon-web-services - 自动释放未使用的 Elastic IPS 的方法

java - AWS Java SDK : AbortedException on call to AmazonSQSClient. 接收消息

javascript - 即时创建带有策略和证书的 AWS IoT "things"

java - 单个对象的自定义迭代器

amazon-s3 - 是否有 S3 策略限制访问只能查看/访问一个存储桶?