Demandes de chargement par lot à Google Cloud Storage à l'aide de javascript

J'essaie de télécharger plusieurs images sur Google Cloud Storage dans une requête par lots en utilisant javascript. J'utilise https://developers.google.com/storage/docs/json_api/v1/how-tos/batch#example comme référence.

J'ai un fichier de saisie où l'utilisateur peut sélectionner plusieurs fichiers, et un fichier 'upload' btn pour uploader à GCS comme tel:

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

Lorsque l'utilisateur sélectionne les images, la fonction 'loadFiles' crée le 'corps' de la requête par lots.

 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; }; } } 

Lorsque l'utilisateur clique sur le chargement:

 $('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); }; 

Voici un exemple de POST généré (utilisant firebug):

Entête:

 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 

Corps:

  --======= 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À   ÿÛ   ... 

Le problème, c'est qu'il n'y a pas de réponse parce que j'ai 400 msg de mauvaise requête. Qu'est-ce qui ne va pas avec cette demande?

Vous envoyez la demande POST comme –

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

Comme indiqué dans les objets de téléchargement avec la demande POST –

Pour télécharger des médias, vous utilisez un URI spécial. Les méthodes POST supportent les téléchargements multimédias avec deux paramètres URI:

  1. Le / télécharger URI , pour les médias. Le format du point final de chargement est l'URI de ressource standard avec un préfixe "/ upload" . Utilisez cet URI lors du transfert des données multimédias elles-mêmes. Exemple: POST /upload/storage/v1beta2/b/myBucket/o .
  2. L'URI des ressources standard , pour les métadonnées. Si la ressource contient des champs de données, ces champs sont utilisés pour stocker des métadonnées décrivant le fichier téléchargé. Vous pouvez utiliser cet URI lors de la création ou de la mise à jour de valeurs de métadonnées. Exemple: POST / storage / v1beta2 / b / myBucket / o.

Donc, vous devez envoyer la demande POST comme –

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

Essayez d'envoyer une demande POST en omettant le préfixe https://www.googleapis.com depuis url.

Merci

Neelam Sharma