【问题标题】:Perform resumable uploads using google-cloud-node使用 google-cloud-node 执行可恢复上传
【发布时间】:2017-05-25 19:21:13
【问题描述】:

此代码非常适合正常上传,但我想知道可恢复上传如何工作,例如,当用户在大型上传过程中失去连接时。在 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);

【问题讨论】:

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


    【解决方案1】:

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

    首先我向存储桶上传 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
      }
    
    });

    【讨论】:

    • 我对您的回答很感兴趣。你能帮我理解一下,“someDataPoint”的内容是什么,是body的payload吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2013-01-12
    • 2018-04-20
    • 2013-07-28
    • 2020-08-27
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多