2017-03-20 1 views
0

Ich versuche, eine Datei direkt vom Browser auf S3 hochzuladen. Dafür erstelle ich eine signierte Upload-URL auf meinem Server.Das Hochladen auf S3 über den Browser mit der URL für den signierten Upload schlägt fehl

Wenn ich versuche, eine Datei an die generierte URL aus dem Browser

var xhr = new XMLHttpRequest(); 
xhr.open('PUT', signedUrl);  
xhr.send(file); 

I

<Error> 
    <Code> 
    SignatureDoesNotMatch 
    </Code> 
    <Message> 
    The request signature we calculated does not match the signature you provided. Check your key and signing method. 
    </Message> 
    ... 
</Error> 

mit laden Sie sich einfach den folgenden Fehlern, die ich auf die signierte URL hochladen kann unter Verwendung von curl mit folgenden Befehl

curl -T <file> -X PUT '<signed-url>' 

Der Browser sendet meine Anfrage als mehrteilige Daten, die c ist ause das Problem. Wie behebe ich das Problem?

ich die signierte URL zu erzeugen den folgenden Code

var params = { 
    Bucket: bucket, 
    Key: s3Key, 
    ACL: "authenticated-read", 
    Expires: 600 
}; 

S3.getSignedUrl('putObject', params, (err, data) => { 
    const returnData = { 
     url: data 
    }; 
    reply(returnData); 
}); 

bearbeiten mit: Nur klar zu sein, habe ich alle Ursprünge erlaubt PUT-Anfragen in Eimer CORS Konfiguration zu senden.

Antwort

0

Okay, das Problem bestand darin, dass Content-Type vom Browser im Anforderungsheader gesendet wurde, die signierte URL jedoch nicht für den Inhaltstyp generiert wurde. Anstelle dieser

var params = { 
    Bucket: bucket, 
    Key: s3Key, 
    ACL: "authenticated-read", 
    Expires: 600 
}; 
S3.getSignedUrl('putObject', params, ...); 

Ich habe diese

var params = { 
    Bucket: bucket, 
    Key: s3Key, 
    ACL: "authenticated-read", 
    Expires: 600, 
    ContentType: require('mime').lookup(filename) 
}; 
S3.getSignedUrl('putObject', params, ...); 

und es funktionierte!

Verwandte Themen