首页 > 解决方案 > 如何在 MySQL 中将 multer 文件作为 blob 上传?

问题描述

我正在尝试将上传到 nodejs 服务器的文件存储到 mysql 数据库中。该文件使用Multer中间件上传和处理,从而将所有文件信息存储在req.files. 我相信,如果我弄错了,请纠正我,这些数据/参数必须以某种方式转换为 blob 格式,但我不知道如何有效地这样做。为了将其上传到 MySQL 数据库,如何做到这一点?

我正在使用最新版本的 XAMPP 和 MySQL InnoDB 表。Multer 生成的文件参数/数据显示在代码片段中。我尝试将整个文件(即req.files[0].

[ { fieldname: 'files',
    originalname: 'Event Information 2018-1_2084.pdf',
    encoding: '7bit',
    mimetype: 'application/pdf',
    destination:
     '/home/millana/Desktop/Brandink/Code/server/middleware/../designs/',
    filename: 'Event Information 2018-1_2084_1559843587360.pdf',
    path:
     '/home/millana/Desktop/Brandink/Code/server/designs/Event Information 2018-1_2084_1559843587360.pdf',
    size: 1125992 } ]

Designs下面显示了调用 restAPI 以在已经存在的表和数据库上执行查询。

router.post('/order', upload.array('files'), (req, res) => {
    console.log(req.files[0].buffer);

    const order_id = 1;
    const position = 'front';

    const sql = `INSERT INTO Designs VALUES ('${order_id}', '${position}', '${req.files[0].filename}', '${req.files[0].mimetype}', '${req.files[0].buffer}')`;


    db.query(sql, (err, result) => {
        if(err) res.status(400).send(err);
        res.status(200).send(result);
    });

});

中间件功能包括:

const storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null,  __dirname + '/../designs/');
    },
    filename: function (req, file, cb) {
        let format = '';

        if      ( file.mimetype === 'image/jpeg' )      format = '.jpg';
        else if ( file.mimetype === 'image/png' )       format = '.png';
        else if ( file.mimetype === 'application/pdf' ) format = '.pdf';


        let fileName = _.split(file.originalname, '.')[0] + '_' + Date.now() + format;
        cb(null, fileName);
    }
});

const upload = multer({
    storage: storage,
    limits: {
        fileSize: MAX_SIZE
    },
});

我希望 blob 大小与文件大小成比例地从一个文件到另一个文件。但是,所有上传文件的大小为 9 个字节,而缓冲区相同,表明正在存储相同的对象/文件。如何相应地存储每个不同的文件?

标签: mysqlnode.jsblobmulter

解决方案


使用文件过滤器怎么样?您可以管理文件的质量或大小等。 https://github.com/expressjs/multer

正如您在链接或您的知识中看到的那样,multer 有一些选项,例如 fileFilter 或限制。fileFilter,类似于您的功能,用于选择文件类型。限制,

文件大小:{ 5 * 1024 * 1024 }

而且我听说存储像图像这样的文件是在缓冲区中转换二进制文件。

如果你 console.log(img 文件),你可以看到 Binary { _bsontype: 'Binary', sub_type: 0, position: 260547, buffer: } }

然后将数组 Buffer 更改为 base64,字符串。结果是,
数据:image/jpeg;base64, v9emlk3SGF45fg...

它不同于“文件名或原始名称”,

所以它可以保存为不同的。


推荐阅读