此代码适用于普通上传,但我想知道如果用户在大型上传过程中失去连接,可恢复上传的工作原理。在writeStream选项中将resumable设置为true,这是唯一必要的工作吗?
我已阅读performing resumable uploads上的此链接,但似乎createWriteStream函数应该封装此行为。
我已经尝试通过在上传过程中关闭我的wifi来测试这个,但是一旦我恢复上传完成上传所需的时间与不间断上传相同,这就是为什么我不确定这是否实际上是在工作。
感谢任何帮助或解释,如果我能澄清任何内容,请告诉我。
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);
答案 0 :(得分:0)
我不相信可恢复的元数据选项是使上传恢复的唯一方法,因此我按照here的说明进行操作。我在下面附上了我的代码。这是针对单个请求可恢复上传,而不是多个块。
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);
}
});

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
}
});