2017-07-28 99 views
8

Używam Evaporate.js do przesyłania plików do S3. Miałem wszystko działa, dopóki nie zdecydowałem się włączyć szyfrowania po stronie serwera.Zły XMLHttpRequest podczas przesyłania do S3

Według dokumentów S3 można go włączyć, przekazując nagłówek. Więc aktualizowane mój code Dodaj wyglądać:

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

pojawia się błąd: 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

Dziwne, że mogę ustawić xAmzHeadersAtInitiate na '{'x-amz-acl': 'public-read'}' i działa dobrze. – Muhambi

+0

Używasz Evaporate.js jako modułu w aplikacji nodejs lub używasz go ze skryptu w przeglądarce? Jeśli przeglądarka, której używasz? –

Odpowiedz

6

Aktualizacja:

pola nagłówka może być tylko znaki ASCII. x-amz-server-side-encryption w kodzie zawiera ukrytą literę. Wpisz go zamiast skopiuj go skądś. Przejdź do tego web page i wklej nazwę pola nagłówka po skopiowaniu ze swojego pytania, zobaczysz co mam na myśli.

Z documentation:

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

musisz być zalogowany nagłówek wraz z adresem URL. Wysłanie nagłówków po podpisaniu adresu URL nie będzie działać.

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

dlaczego w dół? podziel się swoją wiedzą ze światem :) –

+0

Dzięki za odpowiedź, jednak wciąż otrzymuję ten sam błąd "Nie jest to poprawna wartość nagłówka HTTP"? – Muhambi

+1

Czy możesz spróbować użyć 'aws: kms' zamiast' AES256 'i udostępnić wyniki? Upewnij się również, że twoja polityka cher kubełków pozwala na ten nagłówek –