mysql - 如何在 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 个字节,而缓冲区相同,表明正在存储相同的对象/文件。如何相应地存储每个不同的文件?
解决方案
使用文件过滤器怎么样?您可以管理文件的质量或大小等。 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...
它不同于“文件名或原始名称”,
所以它可以保存为不同的。
推荐阅读
- c# - Visual Studio - 根据选择的配置为多个平台构建
- apache-flink - Flink CEP 不匹配任何东西
- javascript - 将页面重定向到 Next JS 中的现有页面和未知页面路由
- javascript - 如何使用 javascript 访问嵌套的子节点
- javascript - 用户输入表单后显示数据(mysql-nodejs)
- dagger-2 - 更新刀柄后,类 DefaultViewModelFactories 中的错误方法 getFragmentFactory 无法应用于给定类型
- html - 如何让所有按钮都留在 div 的底部?
- sql-server - 如何根据另一个表中最后插入的记录更新列值
- android - 如何在两个 Fragments 和 ListViewAdapter (RecyclerView) 之间共享数据
- embedded - 目标 *.elf 的 AtmelStudio 配方失败