Выполните возобновляемую загрузку, используя google-cloud-node

Этот код прекрасно работает для обычной загрузки, но мне интересно, как работает возобновляемая загрузка, когда, например, пользователь теряет соединение в середине большой загрузки. Является ли установка resumable в true в опциях writeStream единственной вещью, необходимой для этого?

Я прочитал эту ссылку при выполнении возобновляемых загрузок, но похоже, что функция createWriteStream должна инкапсулировать это поведение.

Я попытался проверить это, отключив Wi-Fi в середине загрузки, но время, необходимое для завершения загрузки после возобновления загрузки, совпадает с непрерывной загрузкой, поэтому я не уверен, что это на самом деле работает,

Любая помощь или объяснение приветствуется, дайте мне знать, если я могу что-то уточнить.

stream = remoteFile.createWriteStream({gzip: true, resumable: true, metadata: {contentType: file.mimetype} });

stream.on('error', (err: any) => {
    next(err);
    res.status(400).send('err');
});

stream.on('finish', () => {
    res.status(200).send('Success!');
});

stream.end(file.buffer);

1 ответ

Я не доверял опции возобновляемых метаданных как единственному способу возобновления загрузки, поэтому я следовал приведенным здесь инструкциям. Я приложил свой код ниже. Это для повторной загрузки одного запроса, а не для нескольких фрагментов.

Сначала я отправляю запрос POST на URL загрузки корзины, чтобы получить возобновляемый URI сеанса.

let url = 'https://www.googleapis.com/upload/storage/v1/b/bucketname/o?uploadType=resumable&name=testing';

let objBody = JSON.stringify({'metadata': {'someDataPoint': req.body.someDataPoint}});

let contentLength: number = Buffer.byteLength(objBody, 'utf-8');

let options = {
  url: url,
  method: 'POST',
  body: objBody,
  headers: {
    'Content-Length': contentLength,
    'X-Upload-Content-Type': req.file.mimetype,
    'X-Upload-Content-Length': req.file.size,
    'Content-Type': 'application/json; charset=UTF-8'
  }
};

request(options, (error: any, response: any, body: any, stat: any) => {

    if (response && response.statusCode === 200) {
        // send response.headers.location to next function for put request

    } else {
        console.log('err!', error);
        res.status(400).send(error);
    }

});

Затем я отправляю запрос PUT на полученный URI сеанса со своими данными файла

let url = resumableUri;

let options = {
    url: url,
    method: 'PUT',
    body: req.file.buffer,
    headers: {
        'Content-Length': req.file.size,
        'Content-Type': req.file.mimetype,
    }
};

request(options, (error: any, response: any, body: any, stat: any) => {

  if (response && response.statusCode === 200) {
      res.status(200).send('ok');
  } else if (response && response.statusCode >= 500) {
      // send request to resume upload
  } else {
      // try upload again
  }

});

Другие вопросы по тегам