当`PutObjectRequest`的userMetaData中有中文字符时,AWS S3出错

时间:2017-08-17 12:19:44

标签: java amazon-s3 aws-sdk

如果我的中文字符的值为userMetaData的{​​{1}}:

enter image description here

我将收到400错误请求:

PutObjectRequest

以下是不同的汉字:

enter image description here

导致403错误:

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)

请注意,如果userMetaData中没有中文字符,那么一切都很完美。

我的AWS开发工具包版本为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)

1 个答案:

答案 0 :(得分:2)

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

  

用户定义的元数据是一组键值对。 Amazon S3以小写形式存储用户定义的元数据键。 当使用REST 时,每个键值对必须符合US-ASCII,当使用SOAP或基于浏览器的上传时,每个键值对必须符合UTF-8。 (重点补充。)

     

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

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

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

  

标记键的长度最多为128个Unicode字符,标记值的长度最多为256个Unicode字符。

     

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