【问题标题】:Angular/Node.js File Upload only works on files < 64kAngular/Node.js 文件上传仅适用于小于 64k 的文件
【发布时间】:2015-11-23 09:55:18
【问题描述】:

我在上传文件以用于我的项目时遇到问题(PS 我对 Web 编程比较陌生)。我使用 NodeJS/Express/Mongoose/Mongo 和 busboy 作为 API/后端,使用 Angular 和 ng-file-upload 作为前端。

我正在尝试实现基本的文件上传/下载,通过该文件将文件存储在 Mongoose 架构中:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var FileSchema = new Schema({
  filename: { type: String },
  owner: { type: String },
  contentType: { type: String },
  length: { type: Number },
  uploaddate: { type: Date, default: Date.now },
  metadata: {},
  file: { data: Buffer, contentType: String }
});

module.exports = mongoose.model('Files', FileSchema);

节点 API:

api.route('/files')
  .post(function (req, res) {
   if (req.busboy) {
     var newFile = new File();
     var part = 0, buf = [], len = 0;
     var meta = {};
     var md5 = crypto.createHash('md5');

     req.busboy.on('field', function (key, value, keyTruncated, valueTruncated) {
       console.log('[FIELD] KEY:' + key + ' VALUE:' + value);
       if (key == 'owner') newFile.owner = value;
       else meta[key] = value;
   });

   req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
     console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype);
     newFile.filename = filename;
     //newFile.contentType = mimetype;

     file.on('data', function (data) {
       console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
       buf.push(data);
       len = len + data.length;
       part++;
     });
     file.on('end', function () {

       newFile.file.data = Buffer.concat(buf, part);
       md5.update(newFile.file.data);
       newFile.file.contentType = mimetype;
       newFile.length = len;
       console.log('File [' + fieldname + '] Finished');
       meta['md5'] = md5.digest('hex');
       newFile.metadata = meta;
       newFile.save(function (err, data) {
         if (err) console.log(err);
         res.json({ _id: newFile._id });
       })
     });

   });
   req.pipe(req.busboy);
 }
});

这对于任何

我在搞砸什么?

或者,如果有人对如何更好地执行此功能有任何建议。

谢谢!

【问题讨论】:

    标签: angularjs node.js mongodb mongoose


    【解决方案1】:

    Buffer.concat() 的第二个(可选)参数是数组中所有缓冲区的总字节长度,而不仅仅是buf.length。这是一种优化,因为否则Buffer.concat() 将不得不遍历 Buffer 来计算新 Buffer 的总大小。

    考虑到这一点,您需要进行更改:

    newFile.file.data = Buffer.concat(buf, part);
    

    到:

    newFile.file.data = Buffer.concat(buf, len);
    

    【讨论】:

    • 工作就像一个魅力!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2018-09-08
    • 2014-03-08
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多