node.js - 如果新上传的图像达到限制(文件变大等),Multer 会删除上传的图像
问题描述
我正在 node.js 中编写一个 api,并且我正在使用 multer 进行图像上传。我想将封面上传到一本书,效果很好。如果我将新封面上传到同一本书并且图像在限制范围内(文件大小 < 1 MB),那么旧封面将被新封面覆盖,这是我想要的,但如果已经存在封面并且我上传不在限制范围内的新封面(文件大小 > 1 MB),则旧(当前)封面将被删除!这不是我想要的行为。如果上传的图片太大,我不希望旧的(现在的)封面被删除。
澄清一下:我将图像上传到文件系统,并且只将图像的链接存储在数据库中。
上传成功:
文件太大上传(到同一本书):
穆尔代码:
const book_cover_upload = multer({
storage: multer.diskStorage({
destination: book_uploads_destination,
filename: cover_filename
}),
limits: {
fileSize: 1000000 // 1 Megabyte
},
fileFilter: book_file_filter
})
book_uploads_destination 函数:
const book_uploads_destination = (req, file, cb) => {
const destination = path.join('user_uploads', req.user._id.toString(), 'books', req.params.id.toString())
if (!fs.existsSync(destination))
fs.mkdirSync(destination, { recursive: true })
cb(null, destination)
}
封面文件名功能:
const cover_filename = (req, file, cb) => {
const splited_mime_type = file.mimetype.split('/')
const extension = splited_mime_type[splited_mime_type.length - 1]
cb(null, 'cover.' + extension)
}
book_file_filter 函数:
const book_file_filter = async (req, file, cb) => {
const book = await Book.findOne({ _id: req.params.id, entry_created_by: req.user._id })
if (!book)
return cb(new Error('No book found with given id!'))
req.book = book
if (file.mimetype !== "image/jpeg" && file.mimetype !== "image/png")
return cb(new Error('Image must be in JPEG/JPG or PNG format!'))
cb(undefined, true)
}
我做了一些测试。如果我将cover_filename函数中的封面文件名从'cover.' + extension
to更改为'cover_something.' + extension
然后上传太大的图像,则当前的封面图像(我之前上传的cover.jpeg)不会被删除!
所以我认为 multer 总是上传图像并覆盖旧的(当前)图像(我之前上传的)然后它检查文件是否太大并删除刚刚覆盖的图像,如果它太大。
我可以以某种方式改变这种行为,所以它不会覆盖和删除旧图像,如果它达到限制(文件太大)?
谢谢!
解决方案
推荐阅读
- sql - 如何做一个最小和最大日期但跟随价格点的变化
- mongodb - 从流集管道加载 Mongo DB 中的文档创建时间字段
- javascript - 如何使用 Javascript 按顺序动态加载内部脚本
- javascript - 用于以 mm:ss 格式显示计时器的 Moment js
- php - 测试 RESTful API (Lumen) - 是 http/https 协议的问题吗?
- jquery - jQuery以某种方式导致页面滚动到页面底部
- python - 在多列上将宽转换为长的问题
- php - Symfony\Component\Debug\Exception\FatalThrowableError:语法错误,意外的“公共”(T_PUBLIC)
- react-native - react-native-webrtc 中的 getVideoDevices connectycube 有错误
- sql-server - Dax 根据数据可用性查找前一天的销售