我有一个MEAN堆栈应用程序并尝试使用multer上传文件。上传工作正常唯一的问题是我想返回上传文件的ID。
//multer settings for single upload
var upload = multer({ storage: storage }).single('file');
app.post('/upload', upload, function (req, res) {
//// ????? What to return and how?
});
我订阅了这篇文章到angular2服务。 谢谢你的帮助。
答案 0 :(得分:1)
var multer = require('multer');
// storage for upload file.
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './file');
},
filename: function (req, file, callback) {
callback(null, file.originalname);
}
});
var Upload = multer({
storage: storage
}).any('file');
router.post('/upload', postData);
function postData(req, res) {
Upload(req, res, function (error) {
if (error) {
res.status(400).send(error);
}
var obj = {};
obj.file = req.files.filename;
//file is getting stored into database and after it successfully stored
//into database it will return you Id
db.create(obj, function (err, data) {
if (err) {
res.send('error');
}
if (!data) {
res.send('Error');
} else {
console.log('file upload');
res.send(data._id);
}
});
});
}
要返回Id,您必须在数据库中的某处存储引用,之后您将id返回Angular2
答案 1 :(得分:0)
请求文件对象(req.file)不包含任何唯一ID,您必须滚动自己的ID分配逻辑。
您必须考虑您需要该ID的目的,然后您可以使用存储在请求文件对象(req.file
)中的信息使其特定于该文件。
例如,如果所有文件都存储在同一个路径中,并且稍后将使用该ID来检索该文件,那么您必须考虑一个不会给用户输入带来问题的策略。
使用multer
上传的每个文件都包含以下信息:
**:Key:** **:Description:**
fieldname Field name specified in the form
originalname Name of the file on the user's computer
encoding Encoding type of the file
mimetype Mime type of the file
size Size of the file in bytes
destination The folder to which the file has been saved (DiskStorage only)
filename The name of the file within the destination (DiskStorage only)
path The full path to the uploaded file (DiskStorage only)
buffer A Buffer of the entire file (MemoryStorage only)
因此,您可以使用文件名(在表单中使用)req.file.fieldname
。
或原始文件req.file.originalname
(但使用originalname
只会在多次上传相同文件名时产生问题,因此......)
更好的是,通过将当前日期时间戳与filename/original
组合起来为文件创建唯一字符串,如:timestamp-filename.ext
或生成随机哈希(使用字符串timestamp-filename.ext
的示例)
5910c2f5df0471320b8fc179fa6dc1114c1425752b04127644617a26a373694a
(SHA256)
答案 2 :(得分:0)
如果您使用Mongo DB(GridFs-stream)存储文件,则上传函数的res对象具有res.req.file
下的对象,其中包含上传文件的元数据和网格详细信息的所有详细信息下面:
{
fieldname:'file',
originalname:'Screenshot (1).png',
encoding:'7bit',
mimetype:'image/png',
filename:'file-1516342158216.png',
metadata:{
originalname:'Screenshot (1).png',
email:'prasan.g8@gmail.com',
imageType:'ProfilePic'
},
id:5 a618b8e1d9af11f388dcabb,
grid:{
_id:5 a618b8e1d9af11f388dcabb,
filename:'file-1516342158216.png',
contentType:'image/png',
length:675410,
chunkSize:261120,
uploadDate:2018-01 -19 T06:09:18.736 Z,
aliases:undefined,
metadata:{
originalname:'Screenshot (1).png',
email:'prasan.g8@gmail.com',
imageType:'ProfilePic'
},
md5:'fdda12a2f098a915c24162dc410cb3b6'
},
size:undefined
}