2

因此,我試圖上傳文件到谷歌雲存儲使用分段上傳,事先打破文件分塊,並通過http放置請求發送它。谷歌雲存儲分段上傳,最後一個塊失敗(503)

問題是,當我上傳文件的最後一個塊時,出現503錯誤,而不是200個完整的消息。

爲了簡單起見,我使用從驅動器中的JPEG圖像,轉換成團塊,然後字節:

var data = DriveApp.getFileById(DriveImageFileId).getBlob().getBytes(); 

繼文檔,我首先請求可重複的上傳URI。

var accessToken = OAuth2.0_Access_Token; 
    var header = {'X-Upload-Content-Type' : 'image/jpeg'} 
    var body = {"name": "filename.jpeg"} 
    var options = { 
    'method':'post', 
    'contentType':'application/json', 
    'oAuthUseToken':'never', // Disables OAuth1.0 config 
    'muteHttpExceptions':true, 
    'headers':header, 
    'contentLength': 582381, 
    'payload':JSON.stringify(body) 
    }; 

    var response = UrlFetchApp.fetch('https://www.googleapis.com/upload/storage/v1beta2/b/myCloudStoreBucket/o?uploadType=resumable&access_token='+accessToken,options).getHeaders(); 
    var uploadUrl = response.Location 

這工作正常。

我開始將文件字節解析爲256x1024字節的塊,並使用上傳URL通過http使用PUT進行上傳。這不是一個問題,因爲每次我上傳一個塊時,我都會得到一個308響應,並帶有預期的上傳字節數。我可以以256x1024的倍數多次執行此操作,將整個文件上傳至最後一個塊。

這裏是UrlFetchApp選項和頭部上的最後一塊,例如:

var options = { 
"method": "put", 
"contentType": "image/jpeg", 
"contentLength": 58093, 
"oAuthUseToken": "never", 
"muteHttpExceptions": true, 
"headers": { 
    "Content-Range": "bytes 524287-582380/582381" 
}, 
"payload" : <dataBytes> 
} 
var response = UrlFetchApp.fetch(resumeUrl,options); 

哪個返回如下:

Response Type: 503 
Response Header: 
{ 
"Date": "Wed, 16 Apr 2014 06:08:43 GMT", 
"Content-Length": "0", 
"Alternate-Protocol": "443:quic", 
"Content-Type": "text/html; charset=UTF-8", 
"Server": "HTTP Upload Server Built on Apr 7 2014 11:59:06 (1396897146)" 
} 
No Response body or error message. 

的反應應該是200文件上傳完畢。我究竟做錯了什麼?

+0

我在這裏看到了類似的問題,但我已經成功上傳了塊。最後的塊仍然是一個問題:http:// stackoverflow。COM /問題/ 20945286 /上傳功能於塊到谷歌雲存儲錯誤-OUT-503-服務不可用 – Jabberwockey

回答

3

回答自己的問題,因爲這是正在解決:

因此有兩個部分是錯在這裏。

  1. 第一個是最後的文件塊,我最後是發送一個字節 短。我一直在使用我在頭文件中發送的字節範圍來對 字節數組進行分片。最後一個字節被錯過了,因爲這個是 。

    通過調整腳本,使得對於最後一個文件塊,它抓取最後一個尾字節 ,我能夠獲得200 HTTP響應,並且 成功上傳文件。

  2. 第二部分錯誤的是API返回空白503,這應該是 Service Unavailable錯誤。根據雲存儲文檔,您應該嘗試使用exponentially backing off service以應對503. API 應該反而會拋出4xx文件上傳錯誤,這就是爲什麼我花了這麼長時間才找到上傳出現問題的原因。

我向Google雲存儲團隊報告了503錯誤,他們將在接下來的幾個版本中修復其API。