при возобновлении загрузки в GCS Google Cloud Storage подписанный URL-адрес поврежден - PullRequest
2 голосов
/ 03 октября 2019

Я пытаюсь смоделировать возобновляемую загрузку на подписанный URL GCS, используя Postman, чтобы сделать два PUT, чтобы посмотреть, как это работает.

После ссылки на несколько сообщений:

Можно ли выполнить возобновляемую загрузку с подписанным URL-адресом в облачном хранилище Google?

Загрузка в Google Cloud с использованием URL-адреса со знаком

Как использоватьgcs-resumable-upload с подписанным URL

Я наконец сделал это и успешно вернул 200 OK, но файл поврежден. Вот шаги:

0). Отправьте POST на наш сервер (на котором запущен NodeJS 8.11), чтобы получить URL-адрес со знаком bucket с действием == "resumable". Код сервера:

      const file = bucket.file(fileName);
      const config = {
        action: 'resumable',
        version: 'v4',
        expires,
        contentType
      };
      file.getSignedUrl( config, (error, url) => {
        if (error) return reject(error);
        resolve(url);
      });

, который вернет URL-адрес со знаком как:

https://storage.googleapis.com/<bucket_name/<path_to_file>?GoogleAccessId=<service_account>&Expires=<expiry_time>&Signature=<signature>

1). POST к подписанному URL с заголовком { 'x-goog-resumable': 'start' } и пустым телом. Я получил обратно созданный HTTP 201 и заголовок "Location" со значением, таким же, как и подписанный URL, плюс &upload_id=AEnB2UqIJL_jf..... в конце, а также "X-GUploader-UploadID" *Заголовок 1034 * с upload_id.

2). Чтобы смоделировать 2 загрузки для одного размера файла 730417, сначала поместите PUT в «Location», возвращаемое из (1), с заголовками:

Content-Length: 262144
Content-Range: bytes 0-262143/730417
Content-Type: application/pdf

и в Postman выберите тело как «двоичный» и выберите источникфайл. Я получил ответ HTTP 308 (Resume Incomplete) и в заголовке ответа:

Content-Type: text/plain; charset=utf-8
Range: bytes=0-262143
X-Range-MD5: ccafa0beacd8c342bb460b95249114dc
X-GUploader-UploadID: AEnB2UqIJL_jf.....

3). Чтобы проверить текущий статус загрузки, после шага (2) я делаю PUT для того же URL «Location», с пустым телом и заголовком:

Content-Length: 0
Content-Range: bytes */730417

Я получил тот же HTTP 308 (Resume Incomplete), что и в(2) и заголовок ответа:

Content-Type: text/plain; charset=utf-8
X-GUploader-UploadID: (same_upload_id)
Range: bytes=0-262143
X-Range-MD5: ccafa0beacd8c342bb460b95249114dc

и в данный момент я до сих пор не вижу загруженный файл в моем ведре из консоли ведра GCS.

4). Пока все хорошо, поэтому я заканчиваю со второй частью PUT к тому же URL-адресу «Location» со следующим заголовком, выбираю тело как «binary» и выбираю тот же исходный файл:

Content-Length: 468273
Content-Range: bytes 262144-730416/730417
Content-Type: application/pdf

, и явернул HTTP 200 OK с заголовком ответа:

x-goog-generation: 1568787913806411
x-goog-stored-content-length: 730417
ETag: "018677cb75c5a307217eec21fa18ee91"
Content-Length: 0
Content-Type: text/html; charset=UTF-8

и я вижу, что загруженный файл появился в консоли GCS.

5). Проблема в том, что файл, загруженный из GCS, имеет тот же счетчик байтов, что и исходный файл, но контрольная сумма MD5 не совпадает с исходным файлом. Исходный файл представляет собой 3-страничный файл PDF, а загруженный файл после его загрузки имеет только последнюю страницу.

Что может пойти не так? ... я сделал что-то не так в шагах почтальона? ... Похоже, что шаги следуют за шагами здесь https://cloud.google.com/storage/docs/xml-api/resumable-upload правильно, но поврежденный контент является для меня загадкой, и я не уверен, где устранить эту проблему ... возможно, с помощью другого клиента, чтобы попытаться восстановитьзагрузить на подписанный URL-адрес? ... любое предложение очень ценится, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...