5

Я пытаюсь загрузить несколько изображений в облачное хранилище Google в пакетном запросе с помощью javascript. Я использую https://developers.google.com/storage/docs/json_api/v1/how-tos/batch#example в качестве ссылки.Пакетная загрузка запросов в Google Cloud Storage с использованием javascript

У меня есть входной файл, в котором пользователь может выбрать несколько файлов, и «загрузить» БТН для загрузки на ГКС так:

<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 генерируется (с помощью Firebug):

Заголовок:

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. /закачивать 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

Попробуйте отправить запрос POST, опуская префикс https://www.googleapis.com из URL.

Благодаря

Нилам Шарма

Смежные вопросы