Javascript Node.js和Multer-在回调函数(req,res)中处理上传文件的目的地
我是Node.js新手,最近遇到了一个简单的问题 我正在使用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({
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
指定存储文件的位置和方式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.'});
}
}
});
});
});