Я пытаюсь смоделировать возобновляемую загрузку на подписанный 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-адрес? ... любое предложение очень ценится, спасибо!