How to set different destinations in nodejs using multer?

后端 未结 5 1853
你的背包
你的背包 2021-01-31 22:11

I\'m trying to upload any file using Multer package. It\'s working fine when I use following code in my server.js file.

var express         


        
相关标签:
5条回答
  • 2021-01-31 22:28

    You can make a function like so:

    var uploadFnct = function(dest){
            var storage = multer.diskStorage({ //multers disk storage settings
                destination: function (req, file, cb) {
                    cb(null, './public/img/'+dest+'/');
                },
                filename: function (req, file, cb) {
                    var datetimestamp = Date.now();
                    cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]);
                }
            });
    
            var upload = multer({ //multer settings
                            storage: storage
                        }).single('file');
    
            return upload;
        };
    

    And then use it in your upload route:

    //Handle the library upload
        app.post('/app/library/upload', isAuthenticated, function (req, res) {
            var currUpload = uploadFnct('library');
            currUpload(req,res,function(err){
                if(err){
                     res.json({error_code:1,err_desc:err});
                     return;
                }
                res.json({error_code:0,err_desc:null, filename: req.file.filename});
            });
        });
    
    0 讨论(0)
  • 2021-01-31 22:36

    I tried the solutions shown here but nothing helped me.

    ChangeDest attr is not available anymore (As Sridhar proposes in his answer)

    I want to share my solution (I am using express 4.13 and multer 1.2):

    Imports:

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


    Storage variable (see documentation here)

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


    Initializing Multer:

    var upload = multer(
        { 
            dest: 'uploads/',
            storage: storage
        }
    );
    


    Using it!

    router.use("/api/:type", upload.single("obj"));
    router.post('/api/:type', controllers.upload_file);
    
    0 讨论(0)
  • 2021-01-31 22:40

    Multer is a middleware so you can pass it like this :

    app.post('/test/route', multer({...options...}), module.someThing)
    

    or

    app.post('/test/route', multer({...options...}), function(req, res){
    ........some code ......
    });
    
    0 讨论(0)
  • 2021-01-31 22:41
    var storage = multer.diskStorage({
      destination: function (req, file, cb) {
        if (req.path.match('/pdf')) {
          cb(null,<destination>)
        }
      },
      filename: function (req, file, cb) {
      }
    })
    

    This works in case, the path is unique. You can modify (checking for the end point {req.path}) according to your needs. Though this solution is not dynamic.

    0 讨论(0)
  • 2021-01-31 22:54

    Update

    Quite a few things have changed since I posted the original answer.

    With multer 1.2.1.

    1. You need to use DiskStorage to specify where & how of the stored file.
    2. By default, multer will use the operating system's default directory. In our case, since we are particular about the location. We need to ensure that the folder exists before we could save the file over there.

    Note: You are responsible for creating the directory when providing destination as a function.

    More here

    'use strict';
    
    let multer = require('multer');
    let fs = require('fs-extra');
    
    let upload = multer({
      storage: multer.diskStorage({
        destination: (req, file, callback) => {
          let type = req.params.type;
          let path = `./uploads/${type}`;
          fs.mkdirsSync(path);
          callback(null, path);
        },
        filename: (req, file, callback) => {
          //originalname is the uploaded file's name with extn
          callback(null, file.originalname);
        }
      })
    });
    
    app.post('/api/:type', upload.single('file'), (req, res) => {
      res.status(200).send();
    });
    

    fs-extra for creating directory, just in case if it doesn't exists

    Original answer

    You can use changeDest.

    Function to rename the directory in which to place uploaded files.

    It is available from v0.1.8

    app.post('/api/:type', multer({
    dest: './uploads/',
    changeDest: function(dest, req, res) {
        var newDestination = dest + req.params.type;
        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 + '"');
        }
        return newDestination
    }
    }), function(req, res) {
         //set your response
    });
    
    0 讨论(0)
提交回复
热议问题