2017-07-28 96 views
8

我正在使用Evaporate.js上传文件到S3。我已经使所有的工作,直到我决定启用服务器端加密。上传到S3时出现XMLHttpRequest错误

根据S3文档,您可以通过传递标题来启用它。所以,我更新了我的代码添加到看起来像:

var promise = _e_.add({ 
      name: name, 
      file: files[i], 
      started: callback_methods.started, 
      complete: callback_methods.complete, 
      cancelled: callback_methods.cancelled, 
      progress: callback_methods.progress, 
      error: callback_methods.error, 
      warn: callback_methods.warn, 
      paused: callback_methods.paused, 
      pausing: callback_methods.pausing, 
      resumed: callback_methods.resumed, 
      nameChanged: callback_methods.nameChanged, 
      xAmzHeadersAtInitiate: { 'x-amz-server-side​-encryption': 'AES256'} // THIS IS THE ONLY LINE THAT CHANGED!!! 
      } 
     ) 

我得到的错误:DOMException: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 'AWS4-HMAC-SHA256 Credential=XXXXXXXXXXXXXXX/XXXXXXX/us-east-1/s3/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-server-side​-encryption, Signature=XXXXXXXXXXXXXXXXXXXXX' is not a valid HTTP header field value.

+0

奇怪的是我可以设置xAmzHeadersAtInitiate为'{ 'X-AMZ-ACL': '公众阅读的'}',它工作正常。 – Muhambi

+0

您是否将Evaporate.js用作nodejs应用程序中的模块,或者您是否使用了浏览器中的脚本?如果一个浏览器,你正在使用哪一个? –

回答

6

更新:

头字段只能是ASCII字符。代码中的x-amz-server-side-encryption包含隐藏字符。输入它而不是从某处粘贴它。去这个web page并复制你的问题后粘贴标题字段名称,你会明白我的意思。

documentation

You can't enforce whether or not objects are encrypted with SSE-S3 when they are uploaded using pre-signed URLs.

您需要的URL一起签署了头。签署网址后发送标题将不起作用。

var promise = _e_.add({ 
    name: name, 
    file: files[i], 
    started: callback_methods.started, 
    complete: callback_methods.complete, 
    cancelled: callback_methods.cancelled, 
    progress: callback_methods.progress, 
    error: callback_methods.error, 
    warn: callback_methods.warn, 
    paused: callback_methods.paused, 
    pausing: callback_methods.pausing, 
    resumed: callback_methods.resumed, 
    nameChanged: callback_methods.nameChanged, 
    signHeaders: { 'x-amz-server-side-encryption': 'AES256' }, // notice this 
    xAmzHeadersAtInitiate: { 'x-amz-server-side-encryption': 'AES256'} // this should be fine now as we have the header in the signed request too but try removing this if you still get an error. S3 does not require you to re-specify the headers that were already signed. 
}); 
+1

为什么downvote?与世界分享您的知识:) –

+0

感谢您的答案,但是我仍然得到相同的错误“不是一个有效的HTTP头值”? – Muhambi

+1

您可以尝试使用'aws:kms'而不是'AES256'并分享结果吗?此外请确保您的存储桶cors政策允许此标题 –