为什么multer.diskStorage的filename选项需要使用函数而非直接字符串?
为什么multer.diskStorage的filename选项需要使用函数而非直接字符串?
嘿,这个问题问得太实在了!我刚上手multer的时候也踩过这个坑,给你唠唠为啥非得用函数:
1. 从根上避免文件覆盖的大坑
要是直接写死一个字符串比如"myfile.png",那所有上传的文件都会被存成同一个名字——想想看,用户A刚传了一张头像,紧接着用户B也传了一张,直接就把A的文件覆盖了!这在生产环境绝对是会被测试追着打的bug。
而用函数的话,你就能像示例里那样,把Date.now()(精确到毫秒的时间戳)和原文件名拼在一起,这样生成的文件名几乎不可能重复,完美解决覆盖问题:
const diskStorage = multer.diskStorage({ destination: 'uploads/', filename: (req, file, cb) => { cb(null, Date.now() + file.originalname); } });
2. 能拿到请求和文件的上下文信息
函数参数里的req(请求对象)和file(当前上传的文件对象)真的是个宝藏!比如你可以:
- 要是做了用户认证,就用
req.user.id给文件名加个前缀,比如user123_avatar.png,方便区分不同用户的文件 - 读取
file.mimetype判断文件类型,给不同类型的文件加对应后缀,甚至直接拒绝不符合要求的文件 - 结合请求里的业务参数动态命名,比如上传的是商品图片,就存成
product456_main.jpg
要是用固定字符串,这些动态处理的操作根本没法实现——multer根本没法给你传递这些上下文数据。
3. 符合multer的设计逻辑
multer的diskStorage配置里,filename字段的预期值就是一个回调函数,它需要你通过cb回调返回最终的文件名(第一个参数是错误对象,第二个是文件名)。你直接传字符串的话,multer会因为类型不匹配直接抛出错误,就像你示例里标红的❌那样。
说白了,用函数就是为了让你灵活、安全地处理每一个上传的文件,而不是死板地用同一个名字存所有内容~
备注:内容来源于stack exchange,提问作者Naga mani kanta manam
相关产品推荐
相关产品推荐

