Multer gridfs 存储
Multer gridfs Storage
我想更改我的文件名,但是当我检查 console.log (req.file
) 时,我可以看到我更改后的文件名,但是数据库中使用 [=12= 保存了一个不同的文件名].
1. the default filename
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err)
}
const filename = 'file' + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
};
resolve(fileInfo);
});
});
}});
2 this is where i edited the filename
router.post('/', upload.single('file'), (req, res) => {
req.file.filename = req.body.fileName + path.extname(req.file.originalname)
res.redirect('/upload/files')
console.log(req.file)
});
控制台的结果类似于
{ fieldname: 'file',
originalname: '\'YOU CAN ALSO BE GREAT\' - Elon Musk Motivation - Motivational Video.mp4',
encoding: '7bit',
mimetype: 'video/mp4',
id: 5bfb292c13eec142f6c20fd9,
filename: 'a.mp4',
metadata: null,
bucketName: 'contents',
chunkSize: 261120,
size: 19372377,
md5: '513c6220ef3afff644cf8a6dc4cd9130',
uploadDate: 2018-11-25T22:58:52.625Z,
contentType: 'video/mp4' }
{ fileName: 'a' }
这部分在你的代码中
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => { // In this function is where you configure the name of your file
file
配置是在将文件插入数据库之前计算文件名的配置。你正在做的是:
- 生成类似
'file'
的名称以及来自浏览器的任何扩展名,例如:'file.mp4'
- 正在将同名文件保存到数据库中
- 用新名称覆盖您请求中的 属性
- 数据库中的文件保持不变
我认为您真正想要的是在插入
之前生成正确的名称
您可以使用
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err)
}
// In here you have access to the request and also to the body object
const filename = req.body.fileName + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
};
resolve(fileInfo);
});
});
}});
确保从浏览器中的表单发送文件之前的所有字段,否则某些值将是 undefined
,因为它们尚未处理。
我想更改我的文件名,但是当我检查 console.log (req.file
) 时,我可以看到我更改后的文件名,但是数据库中使用 [=12= 保存了一个不同的文件名].
1. the default filename
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err)
}
const filename = 'file' + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
};
resolve(fileInfo);
});
});
}});
2 this is where i edited the filename
router.post('/', upload.single('file'), (req, res) => {
req.file.filename = req.body.fileName + path.extname(req.file.originalname)
res.redirect('/upload/files')
console.log(req.file)
});
控制台的结果类似于
{ fieldname: 'file', originalname: '\'YOU CAN ALSO BE GREAT\' - Elon Musk Motivation - Motivational Video.mp4', encoding: '7bit', mimetype: 'video/mp4', id: 5bfb292c13eec142f6c20fd9, filename: 'a.mp4', metadata: null, bucketName: 'contents', chunkSize: 261120, size: 19372377, md5: '513c6220ef3afff644cf8a6dc4cd9130', uploadDate: 2018-11-25T22:58:52.625Z, contentType: 'video/mp4' } { fileName: 'a' }
这部分在你的代码中
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => { // In this function is where you configure the name of your file
file
配置是在将文件插入数据库之前计算文件名的配置。你正在做的是:
- 生成类似
'file'
的名称以及来自浏览器的任何扩展名,例如:'file.mp4'
- 正在将同名文件保存到数据库中
- 用新名称覆盖您请求中的 属性
- 数据库中的文件保持不变
我认为您真正想要的是在插入
之前生成正确的名称您可以使用
const storage = new GridFsStorage({
url: config.db,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err)
}
// In here you have access to the request and also to the body object
const filename = req.body.fileName + path.extname(file.originalname);
const fileInfo = {
filename: filename,
bucketName: 'contents'
};
resolve(fileInfo);
});
});
}});
确保从浏览器中的表单发送文件之前的所有字段,否则某些值将是 undefined
,因为它们尚未处理。