5

我試圖上傳多個圖像到谷歌雲存儲在使用JavaScript的批量請求。我使用https://developers.google.com/storage/docs/json_api/v1/how-tos/batch#example作爲參考。批量上傳請求到谷歌雲存儲使用javascript

我有一個輸入文件,用戶可以選擇多個文件,和一個「上傳」 BTN上傳到GCS像這樣:

<input type="file" name="fileName" id="fileInput" multiple="multiple" onchange="javascript: loadFiles()"/> 
<input type="button" name="upload-btn" id="upload" value="Upload"/> 

當用戶選擇的圖像時,「loadFiles」函數創建批處理請求的「正文」。

var tok = <token>; 
var boundary = "---======= foo_bar_baz12034245623562346 ==="; 
var consolidated_request = ''; 

function loadFiles() 
{ 
     var input = $('fileInput'); 
     for (var i = 0; i < input.files.length; i++) 
     { 
      var f = input.files[i]; 

      var reader = new FileReader(); 
      reader.readAsBinaryString(f); 

      reader.onload = function(e){ 

       var fbinary = e.target.result; 
       var fsize = f.size; 

       var url = 'https://www.googleapis.com/upload/storage/v1beta2/b/<mybucket>/o?'; 
       url += 'uploadType=media&name='+f.name+ ' HTTP/1.1'; 

       var req = boundary + 
       '\r\nContent-Type: application/http'+ 
       '\r\nContent-Transfer-Encoding: binary'+ 
       '\r\n\nPOST ' + url + 
       '\r\nContent-Type: image/jpeg'+ 
       '\r\nContent-Length: '+ f.size + 
       '\r\nAuthorization: '+tok+ 
       '\r\n\n'+ fbinary + '\n'; 

       consolidated_request += req; 
      }; 

     } 
} 

當用戶點擊上傳:

$('upload').onclick = function(e){ 

    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", 'https://www.googleapis.com/batch', true); 
    xhr.setRequestHeader("Authorization", tok); 
    xhr.setRequestHeader("Content-Type", "multipart/mixed;boundary=" + boundary); 
    xhr.send(consolidated_request); 
}; 

這裏是POST的樣品產生(使用螢火蟲):

部首:

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Authorization Bearer ya29.AHES6ZQgu6gFurD6y7Bo2Mao1RNCFwyqNZcwvgDZ82RXIbQ4 
Content-Length 159866 
Content-Type multipart/mixed; charset=UTF-8;boundary=---======= foo_bar_baz12034245623562346 === 
Host www.googleapis.com 

身體:

--======= foo_bar_baz12034245623562346 === 
Content-Type: application/http 
Content-Transfer-Encoding: binary 

POST https://www.googleapis.com/upload/storage/v1beta2/b/<mybucket>/o?uploadType=media&name=myimage.jpg HTTP/1.1 
Content-Type: image/jpeg 
Content-Length: 69436 
Authorization: Bearer ya29.AHES6ZQgu6gFurD6y7Bo2Mao1RNCFwyqNZcwvgDZ82RXIbQ4 

ÿØÿà�JFIF���d�d��ÿì�Ducky�����<��ÿî�Adobe�dÀ���ÿÛ�� 
... 

問題是沒有響應,因爲我得到了400個錯誤的請求消息。該請求有什麼問題?

回答

1

您發送POST請求作爲 -

POST https://www.googleapis.com/upload/storage/v1beta2/b/<mybucket>/o?uploadType=media&name=myimage.jpg HTTP/1.1 

正如upload objects with POST request指出 -

要上傳的媒體,你使用一個特殊的URI。 POST方法支持媒體上載有兩個端點URI:

  1. 針對/ upload URI,對於媒體。上傳端點的格式是標準資源URI,前綴爲「/ upload」。傳輸媒體數據本身時使用此URI。例如:POST /upload/storage/v1beta2/b/myBucket/o
  2. 標準資源URI,用於元數據。如果資源包含任何數據字段,則這些字段用於存儲描述上傳文件的元數據。您可以在創建或更新元數據值時使用此URI。例如:POST/storage/v1beta2/b/myBucket/o。

所以你需要發送POST請求作爲 -

POST /upload/storage/v1beta2/b/myBucket/o?uploadType=media&name=myimage.jpg HTTP/1.1

嘗試通過從URL省略前綴https://www.googleapis.com發送POST請求。

感謝

尼拉姆夏爾馬

相關問題