javascript - createReadStream 对大文件不起作用/非常慢

标签 javascript node.js express dropbox-api

我正在使用 DropBox API 上传文件。要将文件上传到保管箱,我将执行以下步骤:

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

问题:

由于某些原因,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');

最佳答案

在大量的摸索和挖掘之前和之后,我都有过类似这个问题的经历,无论如何,就我而言,我能够解决这个问题。

对我来说,问题的出现是因为 createReadStream() 的默认分块大小非常小,只有 64kb,而且出于某种原因,这在上传到 Dropbox 时会产生链式 react 。

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

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

关于javascript - createReadStream 对大文件不起作用/非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48065065/

相关文章:

JavaScript:检测对象属性删除

javascript - Firefox 操作系统按键与 jQuery

node.js - Docker:ENTRYPOINT 无法执行命令,因为它找不到文件

javascript - 如何在 Node.JS 项目中正确调整我的代码?

node.js - 给定一个 URL,使用 Node 检索该页面上最大的图像

node.js - 如何将文件数组发送到express后端

javascript - (dart)我想要触发两个不同的 onclick 函数,具体取决于单击时是否选中单选按钮。我怎么做?

javascript - 类型错误 : Cannot read property 'TigerNo' of undefined tempObj ['TigerNo' ] = this. getDefault(sportsRecord).TigerNo

node.js - 我应该如何做一个 elasticSearch ,从 Node.js 正确搜索查询?

javascript - Express.js 中的错误处理