Javascript Node.js和Multer-在回调函数(req,res)中处理上传文件的目的地

Javascript Node.js和Multer-在回调函数(req,res)中处理上传文件的目的地,javascript,node.js,variables,upload,multer,Javascript,Node.js,Variables,Upload,Multer,我是Node.js新手,最近遇到了一个简单的问题 我正在使用multer模块上传图像。 在我的web应用程序中,所有用户都有一个唯一的id,我希望上传的图像存储在一个基于其id命名的目录中 例如: .public/uploads/3454367856437534 这是我的routes.js文件的一部分: // load multer to handle image uploads var multer = require('multer'); var saveDir = multer({

我是Node.js新手,最近遇到了一个简单的问题

我正在使用
multer
模块上传图像。 在我的web应用程序中,所有用户都有一个唯一的id,我希望上传的图像存储在一个基于其id命名的目录中

例如:

.public/uploads/3454367856437534
这是我的
routes.js
文件的一部分:

// load multer to handle image uploads
var multer  = require('multer');
var saveDir = multer({
  dest: './public/uploads/' + req.user._id, //error, we can not access this id from here
  onFileUploadStart: function (file) { 
  return utils.validateImage(file); //validates the image file type
  }
});

module.exports = function(app, passport) {

app.post('/', saveDir, function(req, res) {
                id     : req.user._id,  //here i can access the user id
    });
});

}
如何访问回调
函数(req,res)
外部的
req.user.\u id
属性, 因此,我可以将它与
multer
一起使用,根据id生成正确的目录

编辑以下是我尝试过但没有成功的方法:

module.exports = function(app, passport) {

app.post('/', function(req, res) {
    app.use(multer({
        dest: './public/uploads/' + req.user._id
    }));
});

}

更新

自从我发布最初的答案以来,很多事情都发生了变化

使用
multer 1.2.1

  • 您需要使用
    DiskStorage
    指定存储文件的位置和方式
  • 默认情况下,multer将使用操作系统的默认目录。在我们的例子中,因为我们对位置很挑剔。我们需要确保文件夹存在,然后才能将文件保存在那里
  • 注意:当作为函数提供目的地时,您负责创建目录

    更多

    fs extra
    用于创建目录

    原始答案

    你可以用

    函数重命名要放置上载文件的目录

    可从以下网址获得:


    您可以通过引用输入名称来解决此问题,并在分配路径之前重命名路径

    app.use(multer({ dest: './standard_folder/',
        rename: function (fieldname, filename) {
    
          var pathHelper ='';
          if(fieldname =='otherKindOfFolderNeeded'){
            pathHelper = '../../path/to/other/folder/';
          }
          return pathHelper+uuid.v4()+Date.now();
        },
        onFileUploadStart: function (file) {
          console.log(file.originalname + ' is starting ...')
        },
        onFileUploadComplete: function (file) {
          console.log(file.fieldname + ' uploaded to  ' + file.path)
          done=true;
        }
      })
    );
    

    您可以使用multer来处理上传目录的动态创建。发送文件名之前,应调用输入参数(要为其创建目录)

    var express = require('express');
    var app = express();
    var multer = require('multer');
    var fs = require('fs');
    var mkdirp = require('mkdirp');
    var bodyParser = require('body-parser');
    app.use(bodyParser.json({limit: '5mb'}));
    app.use( bodyParser.json() );       // to support JSON-encoded bodies
    app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
        extended: true,
        limit: '5mb'
    }));
    
    var storage =   multer.diskStorage({
        destination: function (req, file, callback) {
            var Id = req.body.id;
            upload_path = "./"+Id;
            mkdirp(upload_path, function (err) {
                if (err) console.error(err)
                else {
                    console.log('Directory created');
                    //setting destination.
                    callback(null, upload_path);
                }
            });
    
        },
        filename: function (req, file, callback) {
            callback(null, file.orginalname)
        }
    });
    //multer setting and getting paramaters.
    var upload = multer({ storage : storage }).single('upload_file');
    
    //creating request for upload file
    app.post('/uploadFile', function(req, res){
        res.set({ 'content-type': 'application/json; charset=utf-8' });
        res.header("Content-Type", "application/json; charset=utf-8");
        res.header("Access-Control-Allow-Origin", "*");
        res.charset = 'utf-8';
        //function upload_process(){
        upload(req, res, function(err){
            if(err){
                console.log('Error-->');
                console.log(err);
                res.json({"status": "Failure", "message":'There was a problem uploading your files.'+err});
                return;
            }
            else{
                console.log("fieldname"+req.files.length);
                if( req.files.length != 0){
                    res.json({"status" : "Success", "message":'Your files are uploaded.'});
                    console.log('File uploaded!');
                }
                else{
                    console.log("No file uploaded. Ensure file is uploaded.");
                    res.json({"status" : "Failure", "message" : 'No file uploaded. Ensure file is uploaded.'});
    
                }
            }
        });
    
    });
    
    });
    

    希望这有帮助!快乐编码

    你不能。但是你可以把你的multer代码放到
    应用程序中。get
    我已经试过了,multer只是创建了一个没有任何图像的空白目录。如果你认为可以这样做,请发一个例子,谢谢。我可以试试,但是我需要你的图片的代码。确切的代码是什么?multer负责上传部分的工作。如果您是指用于文件类型验证的代码,请忽略它。否当以这种方式使用changeDest时,从user.req获取图像的代码仍然未定义。@Gustus,整个post req正文或req中的特定参数变为未定义?
    app.use(multer({ dest: './standard_folder/',
        rename: function (fieldname, filename) {
    
          var pathHelper ='';
          if(fieldname =='otherKindOfFolderNeeded'){
            pathHelper = '../../path/to/other/folder/';
          }
          return pathHelper+uuid.v4()+Date.now();
        },
        onFileUploadStart: function (file) {
          console.log(file.originalname + ' is starting ...')
        },
        onFileUploadComplete: function (file) {
          console.log(file.fieldname + ' uploaded to  ' + file.path)
          done=true;
        }
      })
    );
    
    var express = require('express');
    var app = express();
    var multer = require('multer');
    var fs = require('fs');
    var mkdirp = require('mkdirp');
    var bodyParser = require('body-parser');
    app.use(bodyParser.json({limit: '5mb'}));
    app.use( bodyParser.json() );       // to support JSON-encoded bodies
    app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
        extended: true,
        limit: '5mb'
    }));
    
    var storage =   multer.diskStorage({
        destination: function (req, file, callback) {
            var Id = req.body.id;
            upload_path = "./"+Id;
            mkdirp(upload_path, function (err) {
                if (err) console.error(err)
                else {
                    console.log('Directory created');
                    //setting destination.
                    callback(null, upload_path);
                }
            });
    
        },
        filename: function (req, file, callback) {
            callback(null, file.orginalname)
        }
    });
    //multer setting and getting paramaters.
    var upload = multer({ storage : storage }).single('upload_file');
    
    //creating request for upload file
    app.post('/uploadFile', function(req, res){
        res.set({ 'content-type': 'application/json; charset=utf-8' });
        res.header("Content-Type", "application/json; charset=utf-8");
        res.header("Access-Control-Allow-Origin", "*");
        res.charset = 'utf-8';
        //function upload_process(){
        upload(req, res, function(err){
            if(err){
                console.log('Error-->');
                console.log(err);
                res.json({"status": "Failure", "message":'There was a problem uploading your files.'+err});
                return;
            }
            else{
                console.log("fieldname"+req.files.length);
                if( req.files.length != 0){
                    res.json({"status" : "Success", "message":'Your files are uploaded.'});
                    console.log('File uploaded!');
                }
                else{
                    console.log("No file uploaded. Ensure file is uploaded.");
                    res.json({"status" : "Failure", "message" : 'No file uploaded. Ensure file is uploaded.'});
    
                }
            }
        });
    
    });
    
    });