【问题标题】:Multer | Stop file upload穆尔特 |停止文件上传
【发布时间】:2014-08-14 07:33:37
【问题描述】:

我正在使用 expressjs 4.0 和 multer 来处理文件上传。

问题是,我想在文件大小超过 maxSize 变量时停止文件上传。但 multer 无论如何都会上传文件。

有没有办法阻止这种行为。

一些示例代码:

app.post('/upload', function(req, res) {

    var maxSize = 32 * 1000 * 1000 // 32mb max

    if(req.files.file.length > maxSize) {
        // stop upload
    } else {
        // continue
        res.send(201);
    }
});

【问题讨论】:

    标签: node.js express multer


    【解决方案1】:

    根据 Multer 文档:(https://www.npmjs.org/package/multer) 您可以使用 onFileUploadStart(file),如果大小超过您的限制,则返回 false。

    例如:

    var express = require('express');
    var multer  = require('multer');
    
    var maxSize = 32 * 1000 * 1000;
    
    var app = express();
    app.use(multer({
      dest: './uploads/',
      onFileUploadStart: function(file, req, res){
        if(req.files.file.length > maxSize) {
          return false;
        }
      })
    }));
    

    【讨论】:

    • 为什么您没有在 onFileUploadStart 事件中检查“文件”参数?
    • 文档中没有onFileUploadStart
    【解决方案2】:

    尝试多重限制–

    app.use('/userimage', multer({
      limits: { fileSize: 1* 1024 * 1024}, //1mb
      onFileUploadStart: function (file, req, res) {
        console.log(file.fieldname + ' fileupload is starting ...');
      }}));
    

    这里有文档https://www.npmjs.org/package/multer

    【讨论】:

    • 这对任何人都有效吗?我查看了文档,但即使 onFileSizeLimit 回调触发,文件仍然被上传。我试着做他们做的事,打电话给fs.unlink('./' + file.path);,但这似乎也没有任何作用。
    • 对于我们丢失的图像,信息是他们的任何选择都是他们的
    • @ErnestoP 这行得通。 Multer 抛出“错误:文件太大”。我知道你现在可能已经想通了,但只是想我会回答。
    • 我做到了!它似乎适用于较新版本的 Multer。我可能正在查看文档中的错误版本或其他内容。现在效果很好。
    【解决方案3】:

    这就是我在项目中处理这个问题的方式。这似乎是目前最好的解决方案。

    api.js

    var multer = require('./config/multer')();
    var utils = require('./utils');
    
    module.exports = function(app, dao) {
      app.post('/docs/:system', multer, function(req, res) {
        var file = req.files.documento;
        if (file.truncated) {
          utils.removeFile(file.path); // remove the truncated file
          return res.status(413).end(); // 413 ("Request Entity Too Large")
        }
        ...
        res.status(200).send({_id : document._id});
      }); ...
    

    config/multer.js

    var multer = require('multer');
    var config = require('./config')();
    
    module.exports = function() {
    
        return multer({ dest: config.BASE_UPLOAD_FOLDER, limits: {fileSize: config.MAX_FILE_SIZE_FOR_UPLOAD},
          ...
          onFileSizeLimit: function (file) {
            console.log('> The file size exceeds the maximum size allowed (' + config.MAX_FILE_SIZE_FOR_UPLOAD/(1024*1024) + 'MB)');
          },
          onFileUploadComplete: function(file) {
            console.log('> File \'' + file.fieldname + '\' stored in \'' + file.path + '\'' + (file.truncated ? ' (TRUNCATED).' : '.') );
          }
        });
    
    };
    

    utils.js

    var fs = require('fs');
    
    var removeFile = function (filePath) {
      try {
        fs.unlink(filePath);
        console.log('File"' + filePath + '" removed!');     
      } catch (err) {
        ...
      }
    };
    ...
    
    exports.removeFile = removeFile;
    

    【讨论】:

      【解决方案4】:

      在 multer "multer": "^1.4.2" 中,使用 fileFilter opts 取消上传

      var uploadImage = multer({
          storage: storage,
          fileFilter: function (req, file, cb) {
              let list = ['png', 'jpg', 'jpeg']
              if (list.indexOf(file.mimetype.split('/')[1]) < 0) {
                  console.log("false")
                  return cb(null, false)
              }
              cb(null, true)
          }
      });
      

      【讨论】:

        【解决方案5】:

        我认为进行这种文件大小检查的最佳位置是在前端而不是后端。当用户选择要上传的文件时,我们可以立即获取文件大小,并在大小超过允许的限制时提醒用户。

        我是这样做的:

        $('#upload input').change(function(click) {
          var file = this.files[0];
          if (file.size > MAX_FILE_SIZE_MB * 1024 * 1024) {
            alert('Sorry, selected file exceeds allowed size limit (' + MAX_FILE_SIZE_MB + 'MB).');
            return false;
          }
        
          // Post file upload request via AJAX
          // ...
        }
        

        【讨论】:

        • 当然我们应该进行客户端检查,但这还不够可靠。服务器端检查是必须的。而且似乎 nodejs 解决方案还不成熟。我不得不做一些 linux 技巧。因为我可以发送任何带有特殊应用程序和方法的文件。我想知道是否可以绝对阻止发送 php 或 sh 文件。
        猜你喜欢
        • 2014-10-17
        • 2012-06-16
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        相关资源
        最近更新 更多