multer:动态目标路径
multer: dynamic destination path
我正在编写一个节点应用程序,我正在寻找可以在服务器上上传文件的东西。当只有一个静态目录时,我可以上传文件。但是我需要为每个用户创建目录,然后根据登录的用户将文件上传到这些目录。我查找了一些东西,但我尝试的所有内容都以错误结束:ENOENT:没有这样的文件或目录,打开...错误.我目前正在尝试做的是 -
let storage = multer.diskStorage({
destination: function(req, file, cb) {
let dest = path.join(__dirname, './documents', 'somenameigetfromtheuser');
let stat = null;
try {
stat = fs.statSync(dest);
}
catch (err) {
fs.mkdirSync(dest);
}
if (stat && !stat.isDirectory()) {
throw new Error('Directory cannot be created');
}
cb(null, dest);
}
});
let upload = multer({
storage: storage,
dest: 'documents/'
});
app.post('/testUpload', upload.single('testfile'), (req, res) => {
res.json({
test: 'test'
})
});
有一个 similar question 已经得到回答,但它对我不起作用,因为我想要请求对象中的目录名称。
当我在 multer 初始化中删除存储 属性 时,文件以随机名称存储在文档目录中。我希望该文件具有其原始名称,并且我希望将其存储在一个目录中,在该目录中我从 req 对象获取目录名称。
帮个小弟,谢谢!
在我的项目中,我使用 multer 如下:
1.Store 文件首先在公共目录中,例如 /tmp/。
2.Copy/move 文件到任何你想要的地方,在我的例子中是 CDN,在你的例子中是一个用户文件夹。
3.Remove 如果需要,/tmp 中的原始文件。
也许 let upload = multer({
storage: storage,
dest: 'documents/'
});
你应该删除这里的 dest,因为你在 storage 中指定了 dest,对吗?
已编辑
见https://github.com/expressjs/multer#diskstorage
Note that req.body might not have been fully populated yet. It depends on the order that the client transmits fields and files to the server.
因此,首先在临时目录中写入文件,从请求中读取目录名称并移动文件:
fs = require('fs-extra'); //npm install fs.extra
...
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '../tempDir/')
},
filename: function (req, file, cb) {
cb(null, file.originalname)
}
});
var upload = multer({
storage: storage
}).single('file');
upload(req, res, function (err) {
if (err) {
res.json({});
return;
}
var dir = JSON.parse(req.body.data).directory;
var filename = req.file.filename;
fs.move('../tempDir/' + fileName, '../tempDir/' + dir + '/' + fileName, function (err) {
if (err) {
return console.error(err);
}
res.json({});
});
});
确保先在客户端附加文本字段,然后才附加文件。就我而言,我有这样的事情:
`
for(let i=0; i<files.length;i++)
{
formData.append("files[]",files[i]);
}
formData.append("username",username);
`
解决方法是先像这样附加文本字段:
`
formData.append("username",username);
for(let i=0; i<files.length;i++)
{
formData.append("files[]",files[i]);
}
`
const storage = multer.diskStorage({
destination: function(req, file, callback){
callback(null, path.dirname('D:/') + 'Integra Qamba Site/');
},
filename: function(req, file, callback){
let data = new Date();
callback(null, dateTime +".jpg");
}
});
我正在编写一个节点应用程序,我正在寻找可以在服务器上上传文件的东西。当只有一个静态目录时,我可以上传文件。但是我需要为每个用户创建目录,然后根据登录的用户将文件上传到这些目录。我查找了一些东西,但我尝试的所有内容都以错误结束:ENOENT:没有这样的文件或目录,打开...错误.我目前正在尝试做的是 -
let storage = multer.diskStorage({
destination: function(req, file, cb) {
let dest = path.join(__dirname, './documents', 'somenameigetfromtheuser');
let stat = null;
try {
stat = fs.statSync(dest);
}
catch (err) {
fs.mkdirSync(dest);
}
if (stat && !stat.isDirectory()) {
throw new Error('Directory cannot be created');
}
cb(null, dest);
}
});
let upload = multer({
storage: storage,
dest: 'documents/'
});
app.post('/testUpload', upload.single('testfile'), (req, res) => {
res.json({
test: 'test'
})
});
有一个 similar question 已经得到回答,但它对我不起作用,因为我想要请求对象中的目录名称。
当我在 multer 初始化中删除存储 属性 时,文件以随机名称存储在文档目录中。我希望该文件具有其原始名称,并且我希望将其存储在一个目录中,在该目录中我从 req 对象获取目录名称。
帮个小弟,谢谢!
在我的项目中,我使用 multer 如下:
1.Store 文件首先在公共目录中,例如 /tmp/。
2.Copy/move 文件到任何你想要的地方,在我的例子中是 CDN,在你的例子中是一个用户文件夹。
3.Remove 如果需要,/tmp 中的原始文件。
也许 let upload = multer({
storage: storage,
dest: 'documents/'
});
你应该删除这里的 dest,因为你在 storage 中指定了 dest,对吗?
已编辑
见https://github.com/expressjs/multer#diskstorage
Note that req.body might not have been fully populated yet. It depends on the order that the client transmits fields and files to the server.
因此,首先在临时目录中写入文件,从请求中读取目录名称并移动文件:
fs = require('fs-extra'); //npm install fs.extra
...
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '../tempDir/')
},
filename: function (req, file, cb) {
cb(null, file.originalname)
}
});
var upload = multer({
storage: storage
}).single('file');
upload(req, res, function (err) {
if (err) {
res.json({});
return;
}
var dir = JSON.parse(req.body.data).directory;
var filename = req.file.filename;
fs.move('../tempDir/' + fileName, '../tempDir/' + dir + '/' + fileName, function (err) {
if (err) {
return console.error(err);
}
res.json({});
});
});
确保先在客户端附加文本字段,然后才附加文件。就我而言,我有这样的事情:
`
for(let i=0; i<files.length;i++)
{
formData.append("files[]",files[i]);
}
formData.append("username",username);
`
解决方法是先像这样附加文本字段:
`
formData.append("username",username);
for(let i=0; i<files.length;i++)
{
formData.append("files[]",files[i]);
}
`
const storage = multer.diskStorage({
destination: function(req, file, callback){
callback(null, path.dirname('D:/') + 'Integra Qamba Site/');
},
filename: function(req, file, callback){
let data = new Date();
callback(null, dateTime +".jpg");
}
});