【问题标题】:Node/Busboy: get file sizeNode/Busboy:获取文件大小
【发布时间】:2015-10-26 17:28:00
【问题描述】:

我使用 busboy 模块通过下面的 coffeeScript 代码解析多部分请求。 有时,问题是在“数据”处理程序上多次调用请求,包括一个文件。 这意味着我需要对每个尺寸求和以计算出整个尺寸。 除了 on 'file' 处理程序中的文件对象似乎不包括大小信息。

如何在不计算每个部分的情况下获得整体尺寸?

提前致谢-

busboy.on 'file', (fieldname, file, filename, encoding, mimetype) ->
  filename = "#{Meteor.uuid()}.jpg"
  dir = "#{HomeDir()}/data/profile"
  saveTo = path.join dir, filename
  file.pipe fs.createWriteStream saveTo
   files.push
     filename: filename
     path: saveTo
     fileSize: data.length
  file.on 'data', (data) ->
    # this data handler called several times 
    files.push
      filename: filename
      path: saveTo
      fileSize: data.length    
  file.on 'end', ->
    console.log 'file finished'

【问题讨论】:

  • 你不能只做files.reduceRight( (v,o) => v+o.fileSize, 0)吗?
  • 这可能是一个很好的解决方案,但我认为我错过了一些巨大的流程或重要的 API。谢谢。

标签: node.js coffeescript busboy


【解决方案1】:

由于您已经将流传输到文件,因此您需要使用类似stream-meter:

var meter = require('stream-meter');
...
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
  ...
  var m = meter();
  file.pipe(m).pipe(fs.createWriteStream(saveTo)).on('finish', function() {
    files.push({
      filename : filename,
      path     : saveTo,
      fileSize : m.bytes,
    });
  });
});

【讨论】:

  • 我的m.bytes 为 0,即使我知道文件的大小不是 0 字节
  • @Growler 尝试检查 error 事件,可能是发生了阻止文件写入的错误(我认为它仍然会触发 @987654326 @事件发生后)
【解决方案2】:

这是一个很晚的回复。我希望它会有所帮助。

request.headers['content-length'] 将为您提供整个文件大小。你不需要busboy。它是请求对象的一部分,可以按如下方式访问:

http.createServer(function(request, response) {

      /* request handling */

      console.log("File size:" + request.headers['content-length'] / 1024 + "KB");

      /* busboy code to parse file */

    }

可以在以下位置找到使用标头大小信息跟踪文件传输进度的示例: NodeJS - file upload with progress bar using Core NodeJS and the original Node solution

编辑:

正如@Matthias Tylkowski 所述,内容长度与文件大小不同。

从那时起,我自己的代码也发生了变化。我注意到在我使用 NODEJS 实现的文件上传器中,我直接使用 HTML5 File API 读取文件大小并将其传递给 nodejs 服务器。

【讨论】:

  • 内容长度不是文件大小,因为标记边界有一些开销
  • @MatthiasTylkowski 感谢您的关注。你说得对。内容长度与文件大小不同。将编辑答案。但是我认为 content-length 将作为计算整体文件传输进度的近似值。
  • 如果请求包含多个文件 - 'content-length' 将显示所有文件大小的总和 + 微小的开销。如果请求是表单数据 - 它可能包含非文件字段。这也会影响内容长度。
  • 这个值不能被依赖,因为攻击者可以简单地改变这个头的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2023-03-31
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多