0

Je tente de télécharger un fichier sur S3 et d'urlencoder le nom de fichier avec ObjectMetadata.setContentDisposition() d'Amazon SDK. Le nom de fichier peut contenir n'importe quel caractère et espace UTF-8. En ce moment, le nom de fichier se casse sur les espaces et j'obtiens une erreur lors de l'utilisation de caractères spéciaux.Exception AWS SignatureDoesNotMatch lors de l'URLEncodage du nom de fichier UTF-8 avec ContentDisposition en Java

L'extrait de code où je l'utilise est comme suit:

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

Malheureusement, cela ne fonctionne pas comme excpected que je reçois l'exception: « AmazonS3Exception: Code d'état: 403, service AWS: Amazon S3, AWS ID de la demande: 3F2C3AE3420561BA, AWS Code d'erreur: SignatureDoesNotMatch, AWS Message d'erreur: La signature de la demande que nous avons calculée ne correspond pas à la signature que vous avez fournie Vérifiez votre clé et la méthode de signature.

Le stacktrace complet:

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) 

J'utilise:
Java 1.6
aws-java-sdk-1.10.2.jar

Toutes aide et suggestions sont les bienvenus. Si plus d'informations sont nécessaires, il suffit de demander.

Br.

Répondre