如何在MySQL中将multer文件上传为Blob?

时间:2019-06-06 18:36:32

标签: mysql node.js blob multer

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

我正在将XAMPP的最新版本与MySQL InnoDB表一起使用。 Multer生成的文件参数/数据显示在代码片段中。我试图将整个文件req.files[0]转换为blob,尽管使用了不同的文件,但存储在MySQL数据库中的blob的大小相同。

[ { 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 } ]

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

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个字节,表示正在存储相同的对象/文件。如何存储每个不同的文件?

1 个答案:

答案 0 :(得分:0)

如何使用fileFilter?您可以管理文件的质量或大小等。 https://github.com/expressjs/multer

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

fileSize:{ 5 * 1024 * 1024 }

我听说存储像image这样的文件是为了在缓冲区中转换二进制文件。

如果您使用console.log(img文件),则可以看到如下输出 二进制{ _bsontype:“二进制”, 子类型:0, 位置:260547, 缓冲区:}}

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

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

因此可以将其另存为一个