使用google-cloud-node执行可恢复的上传

时间:2017-05-25 19:21:13

标签: javascript express google-cloud-storage google-cloud-node

此代码适用于普通上传,但我想知道如果用户在大型上传过程中失去连接,可恢复上传的工作原理。在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);

1 个答案:

答案 0 :(得分:0)

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

首先我发送一个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);
    }

});




然后我用我的文件数据

向收到的会话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
  }

});