2017-07-28 49 views
8

Tôi đang sử dụng Evaporate.js để tải tệp lên S3. Tôi đã có mọi thứ hoạt động, cho đến khi tôi quyết định bật tính năng mã hóa phía máy chủ.Xấu XMLHttpRequest khi tải lên S3

Theo tài liệu S3, bạn có thể bật bằng cách truyền tiêu đề. Vì vậy, tôi đang cập nhật add tôi trông giống như:

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!!! 
      } 
     ) 

tôi nhận được lỗi: 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

Điều kỳ lạ là tôi có thể đặt xAmzHeadersAtInitiate thành '{'x-amz-acl': 'public-read'}' và nó hoạt động tốt. – Muhambi

+0

Bạn có sử dụng Evaporate.js làm mô-đun trong ứng dụng nodejs hay bạn đang sử dụng nó từ một tập lệnh trong trình duyệt? Nếu một trình duyệt, bạn đang sử dụng trình duyệt nào? –

Trả lời

6

Cập nhật:

lĩnh vực Tiêu đề chỉ có thể là ký tự ASCII. x-amz-server-side-encryption trong mã của bạn chứa ký tự ẩn. Nhập nó thay vì sao chép dán từ đâu đó. Đi tới đây web page và dán tên trường tiêu đề sau khi sao chép từ câu hỏi của bạn, bạn sẽ thấy ý tôi là gì.

Từ documentation:

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

Bạn cần đăng nhập tiêu đề cùng với URL. Chỉ cần gửi tiêu đề sau khi ký URL sẽ không hoạt động.

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

tại sao downvote? chia sẻ kiến ​​thức của bạn với thế giới :) –

+0

Cảm ơn câu trả lời, tuy nhiên tôi vẫn nhận được cùng một lỗi "Không phải là giá trị tiêu đề HTTP hợp lệ"? – Muhambi

+1

Bạn có thể thử sử dụng 'aws: kms' thay vì' AES256 'và chia sẻ kết quả không? Ngoài ra, hãy đảm bảo rằng chính sách nhóm thùng của bạn cho phép tiêu đề này –

Các vấn đề liên quan