5

Sto tentando di caricare più immagini su Google Cloud Storage in una richiesta batch utilizzando javascript. Sto usando https://developers.google.com/storage/docs/json_api/v1/how-tos/batch#example come riferimento.Richieste di caricamento batch su Google Cloud Storage utilizzando javascript

Ho un file di input in cui l'utente può selezionare più file, e di un 'upload' btn per caricare GCS in questo modo:

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

Quando l'utente seleziona le immagini, la funzione 'loadFiles' crea il "corpo" della richiesta batch.

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

     } 
} 

Quando l'utente fa clic su upload:

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

Ecco un esempio del POST generato (con Firebug):

Intestazione:

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 

Corpo:

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

Il problema è che non c'è risposta perché ottengo 400 ms di richiesta errata. Cosa c'è di sbagliato in questa richiesta?

risposta

1

Stai inviando richiesta POST come -

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

Come indicato nel upload objects with POST request -

Per caricare i media, si utilizza uno speciale URI. metodi POST sostenere arrivi dei media hanno due punti finali di URI:

  1. Il/caricare URI, per i media. Il formato dell'endpoint di upload è l'URI della risorsa standard con un prefisso "/ upload". Utilizzare questo URI quando si trasferiscono i dati multimediali stessi. Esempio: POST /upload/storage/v1beta2/b/myBucket/o.
  2. La risorsa standard URI, per i metadati. Se la risorsa contiene campi dati, questi campi vengono utilizzati per memorizzare i metadati che descrivono il file caricato. È possibile utilizzare questo URI durante la creazione o l'aggiornamento dei valori dei metadati. Esempio: POST/storage/v1beta2/b/myBucket/o.

Quindi, è necessario inviare richiesta POST come -

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

Provare a inviare richiesta POST omettendo prefisso https://www.googleapis.com da URL.

Grazie

Neelam Sharma

Problemi correlati