【问题标题】:Getting ERR_FS_FILE_TOO_LARGE while using unirest file send with put使用 unirest 文件发送时获取 ERR_FS_FILE_TOO_LARGE
【发布时间】:2020-10-31 06:22:56
【问题描述】:

我正在使用 unirest 上传这样的文件

 unirest.put(fullUri)
    .auth({
      user: self.userName,
      pass: self.password
    })
    .header('X-Checksum-Sha1', sha1Hash)
    .header('X-Checksum-Md5', md5Hash)
    .send(fs.readFileSync(filePath))
    .end(function (response) {

这适用于较小的文件,但对于大文件,我会收到 ERR_FS_FILE_TOO_LARGE 错误。我已经尝试过max_old_space_size,但没有成功。看起来我可以通过流式传输文件来解决此问题,但我在 unirest js 库中找不到执行此操作的 api。

【问题讨论】:

  • 你的内存限制是多少?你有足够的内存来将整个文件加载到内存中吗?
  • 我知道您正在寻找 unirest 的答案,但 unirest 有点过时了。我建议改用 axios。

标签: javascript node.js unirest


【解决方案1】:

我在 unirest js 库中找不到执行此操作的 API。

那是因为没有:https://github.com/Kong/unirest-nodejs/issues/49:

  • 如果需要,您可以使用底层请求库进行流式传输,我对拉取请求持开放态度在此分支或 1.0 版本上添加流式传输。

问题仍未解决。


但是this issuesource code你可以发现end()返回request(见https://github.com/request/request

Unirest.request = require('request')

...

  end: function (callback) {
    ...
    Request = Unirest.request($this.options, handleRequestResponse)
    Request.on('response', handleGZIPResponse)
    ...
    return Request
  }

request 的源代码中,您可以发现尚未发送任何实际请求(已延迟)。所以你可以入侵它。并改用它的 API:

const request = unirest.put(constants.server2)
  .auth({
    user: self.userName,
    pass: self.password
  })
  .header('X-Checksum-Sha1', sha1Hash)
  .header('X-Checksum-Md5', md5Hash)
  // .send(fs.readFileSync(filePath))
  .end(...)

fs.createReadStream(filePath).pipe(request) // just pipe it!

附带说明:unirest 是基于 requestrequest 现在是 deprecated。所以...也许你需要远离unirest

【讨论】:

    【解决方案2】:

    unirest 流式传输文件可通过.attach 方法获得:

     unirest.put(fullUri)
        .auth({
          user: self.userName,
          pass: self.password
        })
        .header('X-Checksum-Sha1', sha1Hash)
        .header('X-Checksum-Md5', md5Hash)
    //    .send(fs.readFileSync(filePath))
        .attach('filename', fs.createReadStream(filePath))
        .end(function (response) {
    

    【讨论】:

    • 我已经试过了,服务器不接受。这仅适用于我认为的多部分/表单数据
    • 还有另一种通过 HTTP 传输数据的方法,使用 Transfer-Encoding: chunkedrequest 包支持,但 unirest 似乎不支持它。您的服务器是否接受任何流媒体方法?
    【解决方案3】:

    看起来这是form-data From GitHub Issues 的问题


    原来unirest正在使用npm模块form-data,而form-data模块要求如果收到不是fs.ReadStream的流,我们需要额外提供文件信息。

    示例:

    form.append( 
      'my_file', 
      stream,
      {
        filename: 'bar.jpg', 
        contentType: 'image/jpeg', 
        knownLength: 19806,
      },
    )
    

    见:https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多