Выполните возобновляемую загрузку, используя 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
}
});