在multer中动态上传文件到项目特定目录

时间:2016-06-08 12:24:27

标签: node.js express meanjs multer

我正在尝试在MEAN.js应用程序中添加文件上传功能。我使用了multer,但它将所有文件直接放在初始化multer时指定的目标位置。我想将文件上传到特定于其上载程序的目录(当然,如果它不存在,则动态创建目录)。我应该在哪里指定动态创建目录并在其中放置文件的自定义逻辑。

3 个答案:

答案 0 :(得分:2)

我尝试了很多解决方案,但没有任何帮助。 最后我写了这个并且它有效!


我的解决方案(我使用快递4.13和multer 1.2):

<强>进口

var express = require('express');
var router = express.Router();
var fs = require('fs');
var multer  = require('multer');


存储变量(请参阅文档here

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        var newDestination = 'uploads/' + req.params.__something;
        var stat = null;
        try {
            stat = fs.statSync(newDestination);
        } catch (err) {
            fs.mkdirSync(newDestination);
        }
        if (stat && !stat.isDirectory()) {
            throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"');
        }       
        cb(null, newDestination);
    }
});


初始化Multer:

var upload = multer(
    { 
        dest: 'uploads/',
        limits: {
            fieldNameSize: 100,
            fileSize: 60000000
        },
        storage: storage
    }
);


使用它!

router.use("/upload", upload.single("obj"));
router.post('/upload', controllers.upload_file);

答案 1 :(得分:1)

你不能。但是,您可以在上载文件后将文件移动到其他位置。这可能是你最好的选择。您可以将存储对象作为模块并通过init

动态更改目录
var multer = require('multer'); //  middleware for handling multipart/form-data,
    // Constructor 
    module.exports = function (name) {
        try {
            // Configuring appropriate storage 
            var storage = multer.diskStorage({
                // Absolute path
                destination: function (req, file, callback) {
                    callback(null, './uploads/'+name);
                },
                // Match the field name in the request body
                filename: function (req, file, callback) {
                    callback(null, file.fieldname + '-' + Date.now());
                }
            });
            return storage;
        } catch (ex) {
            console.log("Error :\n"+ex);
        }
    }

答案 2 :(得分:1)

我认为解决此问题的最佳方法是使用busboy,这样您就可以将图像存储在所需的位置。

var Busboy = require('busboy');
var fs = require('fs');

app.post('.....',fucntion(req, res, next){
var busboy = new Busboy({ headers: req.headers });
    busboy.on('field', function(fieldname, val) {

      req.body[fieldname] = val;
    });
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
fstream = fs.createWriteStream("path/desiredImageName");
        file.pipe(fstream);
        fstream.on('close', function() {

           file.resume();

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