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:
POST /upload/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