загрузить файл через подписанный URL в облачное хранилище Google с ajax - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь загрузить файлы в свое облачное хранилище Google, используя подписанные URL-адреса.

  • Я установил параметры CORS для моего контейнера, используя gsutil
  • . браузер отправляет запрос ajax в Django сервер для получения подписанного URL
  • Django сервер делает запрос к GCS для создания подписанного URL
  • подписанный URL-адрес отправляется обратно в браузер.
  • Я пытаюсь загрузить видеофайл (Content Type = "video / mp4") в GCS , используя этот подписанный URL-адрес в ajax
  • Запрос на GCS код состояния возврата 200
  • И последнее, но не менее важное: в моем корзине создается пустой файл .. .

как предотвратить загрузку пустого файла?
Я не вижу ни в документации GCS, ни в stackoverflow что не так

function ajaxSendToStorage(url, file, row){
  $.ajax({
    method: 'PUT',
    dataType: "xml",
    contentType: file.type,
    crossDomain: true,
    data: file,
    url: url,
    beforeSend: function (request){
        request.setRequestHeader("Content-Type", 'multipart/formdata; charset=UTF-8');
    },
    success: function(data) {
        storageLoadComplete(row)
    },
    complete: function() {
        // do something when complete
    },
  });
}

... и вот что я получаю в логах консоли:

General

URL запроса: https://test-dev-flowker.storage.googleapis.com/media/uploads/FR/flowker_e6938cf0/2020/3/full_9140a387-0595-4ea7-9fdd-f5d525e57515.mp4?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=dev-storage%40brilliant-tower-264412.iam.gserviceaccount.com%2F20200317%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20200317T105745Z&X-Goog-Expires=1800&X-Goog-SignedHeaders=host&x-goog-signature=076e32c738ea28ea3c1a3900d3f0b10e096120649a62911a5b165668045793006bef4b87c372306393db7adb5b35f6bb07e092e87a8ccf6fb7edfc98a74f7cc0558c520ba74b5dc3c1563426edc6f63a5db43c0a78298747fd5b6fbe7650e79ddf75b0cb05b3fb2690f34a5d1fc0e2bdaafa9b2ec6d4c452a23676e45acc0a9205a3fc79dceaf7958590353ac503c597574e53b514b4e44deb8e226f07a3272876760c55edefccb4ef5f0e45555b8f679260bcf1a15421035a1367001b5ace1a28b4d977ce08b29b51a796cc0faca4b4b84296a44876f3a0e7fa1c01667ad40363df2920967a69bc98c388c2713f1fecfcb4cf43d1f9ca36909ac8983eee3212
Способ запроса: * 104 5 * PUT
Код состояния: 200
Удаленный адрес: [2a00: 1450: 4007: 80 c :: 2010]: 443
Политика реферера: no-referer-when-downgrade

Заголовки ответа

access-control-allow-origin: *
access-control-expose-headers: *, Content-Length, Content-Type, Date, Server, Transfer-Encoding, X-GUploader-UploadID, X-Google-Trace
alt- sv c: quic = ": 443"; ма = 2592000; v = "46,43", h3-Q050 = ": 443"; ма = 2592000, h3-Q049 = ": 443"; ма = 2592000, h3-Q048 = ": 443"; ма = 2592000, h3-Q046 = ": 443"; ма = 2592000, h3-Q043 = ": 443"; ma = 2592000
длина содержимого: 0
тип содержимого: text / html; charset = UTF-8
дата: вт, 17 марта 2020 г. 10:57:46 GMT
etag:"d41d8cd98f00b204e9800998ecf8427e"
сервер: UploadServer
статус: 200
x-goog-generation: 1584442666113578
x-goog-ha sh: crc32c = AAAAAA ==
x-goog-ha sh: md5 = 1B2M2Y8AsgTpgAmY7PhCfg ==
x-goog-metageneration: 1
x-goog-Storage-Content-Encoding: идентификатор
x-goog-Storage-Content-length: 0
x-guploader-uploadid : AEnB2UpD_E6yxot73qDMfKu6kM34PPiK7kEM4VytfmZfY6q70dJxBzWs_3y8Lkimwg_ztFTK0Vuoz-V0G_wZlKqah1cax9kJrQ

1111 * Request Headers 1113 *: власть: test-dev-flowker.storage.googleapis.com
1117 * : метод: PUT
: путь: /media/uploads/FR/flowker_e6938cf0/2020/3/full_9140a387-0595-4ea7-9fdd-f5d525e57515.mp4?X-Goog-Algorithm= GOOG4-RSA-SHA256 и X-GOOG-удостоверени = DEV-хранения% 40brilliant к wer-264412.iam.gserviceaccount.com% 2F20200317% 2Fauto% 2Fstorage% 2Fgoog4_request & X-Goog-Date = 20200317T105745Z & X-Goog-Истекает = 1800 & X-GOOG-SignedHeaders = хост-х-GOOG-подпись = 076e32c738ea28ea3c1a3900d3f0b10e096120649a62911a5b165668045793006bef4b87c372306393db7adb5b35f6bb07e092e87a8ccf6fb7edfc98a74f7cc0558c520ba74b5dc3c1563426edc6f63a5db43c0a78298747fd5b6fbe7650e79ddf75b0cb05b3fb2690f34a5d1fc0e2bdaafa9b2ec6d4c452a23676e45acc0a9205a3fc79dceaf7958590353ac503c597574e53b514b4e44deb8e226f07a3272e0d9f60c55edefccb4ef5f0e45555b8f679260bcf1a15421035a1367001b5ace1a28b4d977ce08b29b51a796cc0faca4b4b84296a44876f3a0e7fa1c01667ad40363df2920967a69bc98c388c2713f1fecfcb4cf43d1f9ca36909ac8983eea437
1123 *: схема: https
принять: заявка / xml, текст / xml, / ; q = 0,01
принять кодировку: gzip, deflate, br
принять язык: fr-FR, fr; q = 0.9, en-US; q = 0,8, en; q = 0,7
длина содержимого: 0
происхождение: http://localhost: 8000
реферер : http://localhost: 8000 / фр /
se c -fetch-dest: пусто
se c -fetch- режим: cors
se c -fetch-site: кросс-сайт
user-agent: Mozilla / 5.0 (Linux; Android 6) , 0; Nexus 5 Сложение / MRA58N) AppleWebKit / 537,36 (К HTML, как Gecko) Chrome / 80.0.3987.132 Mobile Safari / 537,36
х-клиент-данные: CKW1yQEIkLbJAQiktskBCKmdygEIt6rKAQjLrsoBCNCvygEIvLDKAQiXtcoBCJu1ygEI7bXKAQiOusoBCOu7ygEIr73KAQ ==
* тысяча сто шестьдесят семь *

Параметры строки запроса

Алгоритм X-Goog: GOOG4-RSA-SHA256
Учетные данные X-Goog: dev-storage@sublime-covid-264412.iam.gserviceaccount.com/20200317/auto/storage/goog4_request
X-Goog-Date: 20200317T105745Z
X-Goog-Expires: 1800
X-Goog-SignedHeaders: host
х-GOOG-подпись: 076e32c738ea28ea3c1a3900d3f0b10e096120649a62911a5b165668045793006bef4b87c372306393db7adb5b35f6bb07e092e87a8ccf6fb7edfc98a74f7cc0558c520ba74b5dc3c1563426edc6f63a5db43c0a78298747fd5b6fbe7650e79ddf75b0cb05b3fb2690f34a5d1fc0e2bdaafa9b2ec6d4c452a23676e45acc0a9205a3fc79dceaf7958590353ac503c597574e53b514b4e44deb8e226f07a3272e0d9f60c55edefccb4ef5f0e45555b8f679260bcf1a15421035a1367001b5ace1a28b4d977ce08b29b51a796cc0faca4b4b84296a44876f3a0e7fa1c01667ad40363d f2920967a69bc98c388c2713f1fecfcb4cf43d1f9ca36909ac8983eea437

1 Ответ

3 голосов
/ 17 марта 2020

ок. Я решил это. Я неправильно связал файл и отправлял нулевой объект. Теперь он работает, но мне пришлось добавить строку, когда я получил ' ошибка недопустимого вызова '.
Мне пришлось добавить processData: false,, и теперь он работает отлично.

здесь это код; если бы это помогло ...

function ajaxSendToStorage(url, uuid, row){
var file = getFileById(uuid);
$.ajax({
    method: "PUT",
    contentType: file.type,
    processData: false,
    dataType: "xml",
    crossDomain: true,
    data: file,
    url: url,
    beforeSend: function (request){
        request.setRequestHeader("Content-Type", 'multipart/formdata; charset=UTF-8');
    },
    success: function(data) {
        storageLoadComplete(row)
    },
    complete: function() {
        var a = 1;
    },

});

}

...