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请求。

感谢

尼拉姆夏尔马

相关问题