2016-04-04 81 views
3

到處工作我使用AWS lambda來創建自己的移動產品的一個簡單的上傳服務URL。AWS簽署除了安卓

在服務器上,我使用下面的代碼

var params = { 
    Bucket: targetS3Bucket, 
    Key: key, 
    Body: '', 
    ContentType: event.contentType, 
    Expires: 60 
}; 

s3.getSignedUrl('putObject', params, function (err, url){ 
    context.done(null, { 
     'oneTimeUploadUrl': url, 
     'resultUrl': urlPrefix + key 
    }); 
}); 

哪裏targetS3Bucket是S3上的文件夾的路徑產生presigned URL,key是文件本身和urlPrefix的名稱的根在S3上的文件的HTTP位置(即:s3.amazonaws.com/some-folder/

使用帶有一個內置的HTTP庫代碼(也就是說,不使用任何AWS SDK)的作品而對PC和iOS失敗,但不在Android上。

最新的Android客戶端代碼的版本是這樣的:

uri = new URL(oneTimeUploadUrl); 

// Setup Connection 
HttpsURLConnection http = (HttpsURLConnection) uri.openConnection(); 
http.setDoOutput(true); 
http.setRequestMethod("PUT"); 
​ 
// Write Data 
OutputStream os = http.getOutputStream(); 
os.write(_bytes); 
os.flush(); 
os.close(); // request gets sent off to the server 

這始終失敗,代碼400。我已經嘗試了幾種方法,例如更改編碼,使用非https版本的HttpsURLConnection以及其他一些東西,但無濟於事。

我寧願避免使在AWS SDK,因爲我只需要這個功能單一的工作,並利用該黏巴達端解決方案已經提出,可以在所有平臺上,除了機器人。

下面是AWS返回的XML。返回的消息令人困惑,因爲客戶機永遠不會更改令牌,並且相同的進程在其他設備上成功。

<?xml version="1.0" encoding="UTF-8"?> 
<Error> 
    <Code>InvalidToken</Code> 
    <Message>The provided token is malformed or otherwise invalid.</Message> 
    <Token-0>{Token-0}</Token-0> 
    <RequestId>{RequestId}</RequestId> 
    <HostId>{HostId}</HostId> 
</Error> 
+0

你可以捕捉伴隨該'400錯誤Request'響應響應主體?應該有一些人類可讀的XML,其中有一些提示可以幫助我們找出具體發生的事情。否則,這只是猜測。 –

+0

更新了主要的意見與此信息 – Mervill

+0

感謝您的更新。我懷疑,我們需要用少一點的修訂來看看事情。在預先標識的URL或錯誤響應沒有什麼是真正敏感 - 的RequestID和主機標識只是珍視AWS支持可以使用它們的日誌研究的錯誤,所以那些不需要顯示(但不敏感),如果你想刪除accesskeyid(通常以A * IA開頭),你可以從URL中刪除它...但我們可能需要查看URL和響應的其餘部分。 –

回答

2

的問題是,HttpURLConnection默默地增加Content-Type: application/x-www-form-urlencoded請求。這很煩人,因爲要確定HttpURLConnection對象的請求中包含哪些標頭並不容易。

無論如何。下面是正確的代碼

uri = new URL(oneTimeUploadUrl); 

// Setup Connection 
HttpsURLConnection http = (HttpsURLConnection) uri.openConnection(); 
http.setDoOutput(true); 
http.setRequestMethod("PUT"); 
http.setRequestProperty("Content-Type"," "); // remove Content-Type header 

// Write Data 
OutputStream os = http.getOutputStream(); 
os.write(_bytes); 
os.flush(); 
os.close(); // request gets sent off to the server 

參見:HttpURLConnection PUT to Google Cloud Storage giving error 403