5

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

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

提前致谢-

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'
4

2 回答 2

8

由于您已经将流传输到文件,因此您需要使用以下内容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,
    });
  });
});
于 2015-08-04T12:56:23.323 回答
4

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

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 - 使用 Core NodeJS 和原始 Node 解决方案的带有进度条的文件上传

编辑:

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

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

于 2018-08-31T08:05:38.163 回答