【问题标题】:AWS SignatureDoesNotMatch exception when URLEncoding UTF-8 filename with ContentDisposition in Java在 Java 中使用 ContentDisposition 对 UTF-8 文件名进行 URLEncoding 时出现 AWS SignatureDoesNotMatch 异常
【发布时间】:2015-11-21 17:56:51
【问题描述】:

我正在尝试将文件上传到 S3 并使用 Amazon SDK 的 ObjectMetadata.setContentDisposition() 对文件名进行 urlencode。文件名可以包含任何 UTF-8 字符和空格。现在文件名在空格上中断,使用特殊字符时出现错误。

我使用的代码sn-p如下:

ObjectMetadata fileMetadata = new ObjectMetadata();
fileMetadata.setContentLength(file.length());
fileMetadata.setContentType(metaContentType);
fileMetadata.addUserMetadata("Filename", metaFileName); 
fileMetadata.setContentDisposition("attachment; filename*=UTF-8 " + URLEncoder.encode(metaFileName,"UTF-8"));  

不幸的是,这并不像我收到的异常那样正常工作:“AmazonS3Exception:状态代码:403,AWS 服务:Amazon S3,AWS 请求 ID:3F2C3AE3420561BA,AWS 错误代码:SignatureDoesNotMatch,AWS 错误消息:请求签名我们计算的与您提供的签名不匹配。请检查您的密钥和签名方法。”。

完整的堆栈跟踪:

at services.AWS_S3_Uploader.AWS_S3_Upload.service(AWS_S3_Upload.java:281)
    at com.sonicsw.xqimpl.service.ServiceMessageHandler.callService(ServiceMessageHandler.java:461)
    at com.sonicsw.xqimpl.service.ServiceMessageHandler.handleMessageCommon(ServiceMessageHandler.java:273)
    at com.sonicsw.xqimpl.service.ServiceMessageHandler.handleMessage(ServiceMessageHandler.java:136)
    at com.sonicsw.xqimpl.service.XQDispatcher.onMessage(XQDispatcher.java:460)
    at com.sonicsw.esb.itinerary.model.EsbStepNode.doExecute(EsbStepNode.java:296)
    at com.sonicsw.esb.itinerary.model.EsbStepNode.execute(EsbStepNode.java:180)
    at com.sonicsw.esb.process.model.impl.DefaultActivityNode.offerIncoming(DefaultActivityNode.java:140)
    at com.sonicsw.esb.itinerary.engine.ItineraryEngine.executeProcess(ItineraryEngine.java:338)
    at com.sonicsw.esb.itinerary.engine.ItineraryEngine.handleToken(ItineraryEngine.java:181)
    at com.sonicsw.esb.itinerary.engine.ItineraryEngine.handleMessage(ItineraryEngine.java:171)
    at com.sonicsw.xqimpl.endpoint.container.EndpointContextContainer.onMessage(EndpointContextContainer.java:116)
    at com.sonicsw.xq.connector.jms.JMSEndpointMessageListener.onMessage(JMSEndpointMessageListener.java:259)
    at progress.message.jimpl.Session.deliver(Session.java:3086)
    at progress.message.jimpl.Session.run(Session.java:2489)
    at progress.message.jimpl.Session$SessionThread.run(Session.java:2881)
Caused by: java.lang.Exception: AmazonServiceException
    at services.AWS_S3_Uploader.AWS_S3.logAmazonServiceException(AWS_S3.java:340)
    at services.AWS_S3_Uploader.AWS_S3.uploadObject(AWS_S3.java:280)
    at services.AWS_S3_Uploader.AWS_S3_Upload.service(AWS_S3_Upload.java:263)
    ... 15 more
Caused by: AmazonS3Exception: Status Code: 403, AWS Service: Amazon S3, AWS Request ID: 3F2C3AE3420561BA, AWS Error Code: SignatureDoesNotMatch, AWS Error Message: The request signature we calculated does not match the signature you provided. Check your key and signing method., S3 Extended Request ID: 0AlM9giKI8hRMWG0Xc84lxXSJ8ZwUPB2DjHKddwa1oVZ4AWUzlyko7jEko9MEtwkd5Tc7xocFJw=
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:644)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:338)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:190)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:2979)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1159)
    at com.amazonaws.services.s3.transfer.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:97)
    at com.amazonaws.services.s3.transfer.internal.UploadCallable.call(UploadCallable.java:89)
    at com.amazonaws.services.s3.transfer.internal.UploadMonitor.upload(UploadMonitor.java:179)
    at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:137)
    at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:48)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

我正在使用:
Java 1.6
aws-java-sdk-1.10.2.jar

欢迎所有帮助和建议。 如果需要更多信息,请询问。

兄弟。

【问题讨论】:

    标签: java amazon-web-services utf-8 amazon-s3 content-disposition


    【解决方案1】:

    我不知道是不是这个原因,但是用于 filename* 的编码不正确。有关规范,请参阅http://greenbytes.de/tech/webdav/rfc6266.html#disposition.parameter.filename。

    【讨论】:

    • 所以你的意思是我应该用 ISO-8859-1 对其进行编码?
    • 不,UTF-8 是正确的选择。但是仔细看看引号是如何工作的。
    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多