首页 > 解决方案 > 如果新上传的图像达到限制(文件变大等),Multer 会删除上传的图像

问题描述

我正在 node.js 中编写一个 api,并且我正在使用 multer 进行图像上传。我想将封面上传到一本书,效果很好。如果我将新封面上传到同一本书并且图像在限制范围内(文件大小 < 1 MB),那么旧封面将被新封面覆盖,这是我想要的,但如果已经存在封面并且我上传不在限制范围内的新封面(文件大小 > 1 MB),则旧(当前)封面将被删除!这不是我想要的行为。如果上传的图片太大,我不希望旧的(现在的)封面被删除。

澄清一下:我将图像上传到文件系统,并且只将图像的链接存储在数据库中。

上传成功:

json响应

cover.jpeg 保存到文件系统

文件太大上传(到同一本书):

json响应

现在的cover.jpeg被删除了!

穆尔代码:

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.' + extensionto更改为'cover_something.' + extension然后上传太大的图像,则当前的封面图像(我之前上传的cover.jpeg)不会被删除!

所以我认为 multer 总是上传图像并覆盖旧的(当前)图像(我之前上传的)然后它检查文件是否太大并删除刚刚覆盖的图像,如果它太大。

我可以以某种方式改变这种行为,所以它不会覆盖和删除旧图像,如果它达到限制(文件太大)?

谢谢!

标签: node.jsmulter

解决方案


推荐阅读