NodeJS Multer上传具有不同名称且没有扩展名的二进制文件,而不是原始文件

whhtz7ly  于 2022-12-03  发布在  Node.js
关注(0)|答案(2)|浏览(312)

当我尝试在multer中使用上传时,上传的文件是二进制的(没有csv扩展名),并给予文件名一个非常随机的名称,有人知道为什么会发生这种情况吗?此外,我正在使用 Postman 发送POST请求,如果这有帮助的话。
我试过改变mimetype和上传配置的名称,仍然没有帮助。

const express = require("express");
const multer = require('multer');

const router = express.Router();
const upload = multer({
dest: './uploads',
mimetype: 'text/csv'
})

router.post('/upload',upload.single('upload'),(res,req,next)=>{
});

module.exports = router;

我没有收到任何错误消息,但本地计算机上的保存文件没有扩展名,其名称为例如:**********
感谢您的帮助!

mcdcgff0

mcdcgff01#

我已经成功上传了fie使用下面的代码使用下面的代码作为参考。
//middleware.js

const multer = require('multer');

const upload = (file) => {
    var storage = multer.diskStorage({
        destination: function (req, file, cb) {
            cb(null, './uploads/')
        },
        filename: function (req, file, cb) {
            console.log("File Object",file);
            let ext = '';
            if(file.originalname.split('.').length >1 ){
                ext = file.originalname.substring(file.originalname.lastIndexOf('.'));
            }
            console.log('ext', ext);
            cb(null, file.fieldname + '-' + Date.now() + ext)
        }
    })
    return multer({ storage: storage }).array(file);
}
module.exports = {
    upload
}

//file.route.js

const uploadMiddleware = require('../middleware/middleware');

fileRoutes.route('/imgUploadMiddleWare')
    .post([uploadMiddleware.upload('img'), fileValidation.checkFile], fileController.uploadFile);
busg9geu

busg9geu2#

Multer并没有以二进制格式存储文件。它只是删除了扩展名并随机化文件名以避免冲突。如果你只是添加了正确的扩展名,你就得到了你的文件。

例如:原始文件hello.jpg被存储为9958216fa970f07a2d2382e66fb77f05,只需将其扩展名更改为9958216fa970f07a2d2382e66fb77f05.jpg
来自文件:Multer

默认情况下,Multer会对文件进行重命名,以避免命名冲突。重命名功能filename可以根据您的需要进行定制。
Multer出于安全原因不会附加任何文件扩展名,您的函数应返回一个带有文件扩展名的完整文件名。

如何以编程方式实现这一点:原始名称+扩展名

var multer = require('multer');
var path = require('path')

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    /*Appending extension with original name*/
    cb(null, file.originalname + path.extname(file.originalname)) 
  }
})

var upload = multer({ storage: storage });
  • path用于获取文件的扩展名
  • file对象有originalname字段来获取它。尽管我推荐另一个附加值,如file.originalname + Date.now(),以避免名称冲突并实现级别的唯一性。

相关问题