5

javascriptを使用してGoogle Cloud Storageに複数の画像をバッチリクエストでアップロードしようとしています。私は参考としてhttps://developers.google.com/storage/docs/json_api/v1/how-tos/batch#exampleを使用しています。javascriptを使用してGoogle Cloud Storageにリクエストをバッチアップロード

は、私は、ユーザーが複数のファイルを選択することができ、入力ファイルを持っている、などのようなGCSにアップロードするBTN「アップロード」:ユーザーが画像を、「ロードファイル」関数が作成するを選択

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

バッチリクエストの 'body'。

アップロードをユーザがクリック
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の不正なリクエストmsgが返されるため、応答がないことです。そのリクエストに何が間違っていますか?

答えて

1

としてあなたはPOSTリクエストを送信している - upload objects with POST requestで述べたように

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

- メディアをアップロードするには

は、あなたは特別なURIを使用します。 /メディアのURIを、アップロード

  1. :POSTメソッドは、メディアのアップロードは、2つのURIエンドポイントを持ってサポートしています。アップロードエンドポイントの形式は、"/ upload"のプレフィックスを持つ標準リソースURIです。この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リクエストを送信してみてください。

おかげ

ニーラム・シャルマ

関連する問題