问题描述
我正在尝试将文件上传到 Google Cloud Storage 存储桶和 MongoDB,这实际上是有效的,但更改文件名不是因为我不能,我已经在网上查找过,但看不到类似的代码我的,那么如何更改文件 originalname
向其添加 date.Now()
。
我的代码
const multer = Multer({
storage: Multer.memoryStorage(),limits: {
fileSize: 5 * 1024 * 1024,// no larger than 5mb,you can change as needed.
},});
//CREATE Feed
Router.post('/',multer.array('files'),authoriazation,async (req,res) => {
const { txt,Feedtype } = req.body
const text = htmlToText(txt,{
wordwrap: 130
});
// uploading multiple image
const creteFeed = await new Feed({
Feedby: req.user,FeedTxt: text,deleted: 0,FeedReaction: 0,FeedComment: 0,FeedShare: 0,FeedType: Feedtype,})
const newFeed = await creteFeed.save()
if (req.files.length > 0) {
for (newfile of req.files) {
const blob = bucket.file(newfile.originalname);
const blobStream = blob.createWriteStream();
if (newFeed) {
const FeedMed = await new FeedMedia({
Feed_id: newFeed._id,Feedby: req.user,FeedMedia_type: newfile.mimetype,FeedMedia_name: newfile.originalname,category: 'Feed',url: `https://storage.googleapis.com/${bucket.name}/${newfile.originalname}`,deleted: 0
})
const newFeedMed = await FeedMed.save()
}
blobStream.on('finish',async() => {
});
blobStream.end(newfile.buffer);
}
}
res.json('success')
})
解决方法
您使用的 Multer.memoryStorage
不支持文件名选项,因为您在内存中存储文件时没有文件名。
https://github.com/expressjs/multer/issues/288
您可以改用 Multer.diskStorage
。
https://www.npmjs.com/package/multer#diskstorage
var storage = multer.diskStorage({
destination: function (req,file,cb) {
cb(null,'/tmp/my-uploads')
},filename: function (req,file.fieldname + '-' + Date.now())
}
})
var upload = multer({ storage: storage })
,
如果您想将 Date.now() 添加到 SERVER SIDE 中的 file.originalname,您可以这样做:
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req,callback) {
callback(null,'www/img/');
},Date.now() + '_' + file.originalname); // <-- CHANGE HERE
}
})
const upload = multer({ storage: storage });
app.post("/upload",upload.single('file'),(req,res) => {
res.status(200).send();
})
并制作一个 Fetch 帖子,以便:
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req,res) => {
res.status(200).send();
})
但是,如果您想在 CLIENT SIDE 中将 Date.now() 添加到 file.originalname你可以这样做:
const file = document.querySelector("input#file").files[0];
const formData = new FormData()
formData.append('file',file); // <-- DO NOT CHANGE HERE
fetch('/upload',{
method: 'POST',body: formData
});
并制作一个 Fetch 帖子:
const file = document.querySelector("input#file").files[0];
const formData = new FormData()
formData.append('file',body: formData
});
在这种情况下,file.originalname 将在发布后在 SERVER SIDE 中更改。