createReadStream不工作/大文件速度极慢

时间:2018-01-02 17:08:21

标签: javascript node.js express dropbox-api

我使用DropBox API上传文件。要将文件上传到Dropbox,我将执行以下步骤:

  1. 首先将文件从form上传到服务器上的本地目录。
  2. 使用fs.createReadStream
  3. 从本地目录中读取文件
  4. 通过Dropbox API将文件发送到Dropbox。
  5. 问题:

    出于某种原因,fs.createReadStream在阅读和上传大文件时需要绝对年龄。现在,我尝试上传的文件只有 12MB ,这不是一个大文件,上传/处理12MB文件需要大约18分钟

    我不知道问题出在createReadStream或dropbox api代码中的哪个位置。

    适用于kb范围内的文件。

    我的代码:

    let options = {
        method: 'POST',
        uri: 'https://content.dropboxapi.com/2/files/upload',
        headers: {
            'Authorization': 'Bearer TOKEN HERE',
            'Dropbox-API-Arg': "{\"path\": \"/test/" + req.file.originalname + "\",\"mode\": \"overwrite\",\"autorename\": true,\"mute\": false}",
            'Content-Type': 'application/octet-stream'
        }, 
    
          // I think the issue is here.
          body: fs.createReadStream(`uploads/${req.file.originalname}`)
    };
    
     rp(options)
        .then(() => {
            return _deleteLocalFile(req.file.originalname)
        })
        .then(() => {
            return _generateShareableLink(req.file.originalname)
        })
        .then((shareableLink) => {
            sendJsonResponse(res, 200, shareableLink)
        })
        .catch(function (err) {
            sendJsonResponse(res, 500, err)
        });
    

    更新

    const rp = require('request-promise-native');
    

2 个答案:

答案 0 :(得分:2)

在大量头部刮伤和挖掘之前和之后,我有类似于这个问题的经历,无论如何,我能够解决这个问题。

对我来说,问题出现是因为createReadStream()的默认分块大小非常小64kb,这在某些情况下会在上传到Dropbox时产生影响。

因此解决方案是增加块大小。

// Try using chunks of 256kb
body: fs.createReadStream(`uploads/${req.file.originalname}`, {highWaterMark : 256 * 1024});

答案 1 :(得分:0)

https://github.com/request/request#streaming

我认为您需要将流管道传递给请求。

看到这个答案:  Sending large image data over HTTP in Node.js