Node.js和Multer – 在callback函数(req,res)中处理上传文件的目的地

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

我正在使用一个名为multer的模块,所以用户可以上传图片。 在我的networking应用程序中,所有的用户都有一个唯一的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.user._id 

外面的

 function(req,res) 

所以我可以使用它与multer基于ID生成适当的目录?

编辑这里是我已经尝试过,没有工作:

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

更新

自从我发布原始答案以来,不less事情已经发生了变化。

multer 1.2.1

  1. 您需要使用DiskStorage来指定存储文件的位置方式
  2. 默认情况下,multer将使用操作系统的默认目录。 在我们的情况下,因为我们对位置特别。 我们需要确保该文件夹存在之前,我们可以保存在那里的文件。

注意:在提供目的地作为function时,您负责创build目录。

更多在这里

 'use strict'; let multer = require('multer'); let fs = require('fs-extra'); let upload = multer({ storage: multer.diskStorage({ destination: (req, file, callback) => { let userId = req.user._id; let path = `./public/uploads//${userId}`; 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('/', upload.single('file'), (req, res) => { res.status(200).send(); }); 

fs-extra用于创build目录, 以防万一它不存在

原始答案

你可以使用changeDest

重命名放置上传文件的目录的function。

它可以从v0.1.8获得

 app.post('/', multer({ dest: './public/uploads/', changeDest: function(dest, req, res) { var newDestination = dest + req.user._id; 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 }); 

你可以解决这个只是指input名称,并在分配它之前重命名path。

 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完成此操作,以处理上传目录的dynamic创build。 input参数(您要为其创build目录)应在发送文件名之前调用。

 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.'}); } } }); }); }); 

希望这可以帮助! 快乐的编码