当前位置: 首页 > 知识库问答 >
问题:

在Java中使用ContentDisposition对UTF-8文件名进行URLEncoding时,AWS SignatureDoesNotMatch异常

壤驷茂实
2023-03-14

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

我使用它的代码片段如下:

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"));  
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)

欢迎所有的帮助和建议。如果需要更多的信息,那就问吧。

布罗。

共有1个答案

融泓
2023-03-14

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

 类似资料:
  • 问题内容: 我是越南人,我想上传utf-8文件名,例如 这是我的代码 但是当我上传时,我在计算机D:\上看到的文件如下 如何解决这个问题 问题答案: 我使用的是Windows 8中文版,与此同时我也遇到类似的问题: 代表并代表Code page 936 ,这是Windows简体中文版的默认代码页。 所以我认为也许您的问题可以通过类似的方式解决: 我不太确定您的操作系统的默认代码页是否正确,您应该通

  • 问题内容: 我在写一些注释过的PHP类,但偶然发现了一个问题。我的名字(用于@author标记)以一个(以UTF-8字符开头,…和一个奇怪的名字,我知道)结尾。 即使我将文件另存为UTF-8,也有一些朋友报告说他们看到这个字符完全弄乱了()。通过添加BOM表签名可以解决此问题。但是那件事让我有些烦恼,因为除了我在Wikipedia上以及关于SO的其他一些类似问题上所了解的之外,我对此并不了解。 我

  • 问题内容: 我正在使用此代码通过OpenCSV将波斯语单词添加到csv文件中: 当我在Excel中打开生成的csv文件时,它包含 “ứỶờịỆ” 。其他程序(例如notepad.exe)没有此问题,但是我所有的用户都在使用MS Excel。 与更换OpenCSV SuperCSV不解决这个问题。 当我手动将波斯字符输入到csv文件中时,我没有任何问题。 问题答案: 不幸的是,CSV是一种非常特殊的

  • 问题内容: 有人可以给我看一个简单的示例,如何使用新的lambda语法在Java 8中按字母顺序排序。 问题答案: 对于字符串,这将工作

  • 我们正在使用HSM(硬件安全模块)对java应用程序进行签名和加密。我们已经使用java将HSM插入JVM。使用以下条目的安全属性文件 这些天它一直运行良好,突然我们遇到了如下错误。 我们在谷歌上做了足够的搜索,但无法找出根本原因。 感谢任何帮助 谢谢

  • 本文向大家介绍java使用异或对文件进行加密解密,包括了java使用异或对文件进行加密解密的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java使用异或对文件进行加密解密的具体代码,供大家参考,具体内容如下 1.使用异或的方式加密文件的原理 一个数异或另一个数两次,结果一定是其本身 2.使用异或的原理加密文件 3.使用异或的原理解密文件 以上就是本文的全部内容,希望对大家的学习有所