>我正在尝试将上传到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 字节,而缓冲区相同,表示正在存储相同的对象/文件。如何相应地存储每个不同的文件?
使用fileFilter怎么样?您可以管理文件的质量或大小等。 https://github.com/expressjs/multer
正如您在链接或您的知识中看到的那样,multer 有一些选项,例如 fileFilter 或限制。 fileFilter,类似于你的函数,来选择文件类型。 限制
文件大小 : { 5 * 1024 * 1024 }
我听说存储图像等文件是为了转换缓冲区中的二进制文件。
如果你控制台.log(IMG文件),你可以看到输出,如 二进制 { _bsontype:"二进制", sub_type: 0, 位置: 260547, 缓冲区: } }
然后将数组缓冲区更改为 base64,字符串。 结果是,
数据:图像/JPEG;base64, v9emlk3SGF45fg...
它不同于"文件名或原始名称",
因此,它可以另存为不同的。