0

此代码适用于正常上传,但我想知道可恢复上传如何工作,例如,当用户在大型上传过程中失去连接时。在 writeStream 选项中将 resumable 设置为 true 是唯一必要的吗?

我已经阅读了这个关于执行可恢复上传的链接,但似乎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);

4

1 回答 1

0

我不相信可恢复元数据选项是使上传可恢复的唯一方法,因此我按照此处的说明进行操作。我在下面附上了我的代码。这是针对单个请求可恢复上传,而不是多个块。

首先,我向存储桶上传 url 发送 POST 请求以接收可恢复会话 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);
    }

});

然后我用我的文件数据向收到的会话 uri 发送一个 PUT 请求

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
  }

});

于 2017-09-05T16:41:33.233 回答