在multer中动态上传文件到项目特定目录
Upload file to project specific directory dynamically in multer
我正在尝试在我的 MEAN.js 应用程序中添加文件上传功能。我使用了 multer,但它将所有文件直接放在初始化 multer 时指定的目标中。我想将文件上传到特定于要为其上传的程序的目录(当然,如果目录不存在,则动态创建目录)。我应该在哪里指定动态创建目录并将文件放入其中的自定义逻辑。
你不能。但是,您可以在上传文件后将文件移动到其他位置。这可能是您最好的选择。您可以使存储对象成为一个模块并通过 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);
}
}
我认为解决这个问题的最好方法是使用 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);
})
我尝试了很多解决方案,但没有任何帮助。
最后我写了这个并且它有效!
我的解决方案(我使用的是 express 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);
我正在尝试在我的 MEAN.js 应用程序中添加文件上传功能。我使用了 multer,但它将所有文件直接放在初始化 multer 时指定的目标中。我想将文件上传到特定于要为其上传的程序的目录(当然,如果目录不存在,则动态创建目录)。我应该在哪里指定动态创建目录并将文件放入其中的自定义逻辑。
你不能。但是,您可以在上传文件后将文件移动到其他位置。这可能是您最好的选择。您可以使存储对象成为一个模块并通过 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);
}
}
我认为解决这个问题的最好方法是使用 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);
})
我尝试了很多解决方案,但没有任何帮助。 最后我写了这个并且它有效!
我的解决方案(我使用的是 express 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);