You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Node.js表单上传文件作为Blob存入MySQL数据库?

解决文件内容以Blob存入MySQL的问题

1. 修改HTML表单

表单必须添加enctype="multipart/form-data"属性,否则无法传输文件内容,只能拿到文件名:

<form action="/addPage" method="POST" enctype="multipart/form-data">
<h3>Add Page:</h3>
<p>Give icon: <input name='plik' type="file"/></p>
<p>Link: <input name='link' type="text"/></p>
<p>Title: <input name='tytul' type="text"/></p>
<p>Opis: <input name='opis' type='text'/></p>
<p><input type="submit"/></p>
</form>

2. 配置Node.js的文件上传中间件

使用multer中间件处理multipart格式的请求(先执行npm install multer安装依赖):

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

// 配置multer使用内存存储(适合图标这类小文件),也可根据需求改为磁盘存储
const storage = multer.memoryStorage();
const upload = multer({ storage: storage });

// 在/addPage路由上应用中间件,指定处理名为plik的文件字段
app.post('/addPage', upload.single('plik'), async (req, res) => {
  try {
    // req.file.buffer就是文件的二进制内容(Buffer类型)
    const fileBuffer = req.file?.buffer;
    const link = req.body.link;
    const tytul = req.body.tytul;
    const opis = req.body.opis;

    if (!fileBuffer) {
      return res.status(400).send('请选择要上传的图标文件');
    }

    // 直接传入Buffer,mysql2会自动转换为Blob类型插入数据库
    const [re] = await global.db.query(
      'INSERT INTO sites (icon, link, tytul, opis) VALUES (?, ?, ?, ?);',
      [fileBuffer, link, tytul, opis]
    );

    res.send('数据插入成功');
  } catch (err) {
    console.error(err);
    res.status(500).send('插入失败');
  }
});

3. 关键说明

  • 确保MySQL表中icon字段类型为BLOB(或MEDIUMBLOB/LONGBLOB,根据文件大小选择)
  • 之前使用的LOAD_FILE()函数是读取MySQL服务器本地文件的,和客户端上传的文件无关,这是导致icon字段为null的核心原因
  • 如果上传文件较大,建议改用multer的磁盘存储模式,再读取文件Buffer存入数据库,避免内存占用过高

内容的提问来源于stack exchange,提问作者Mistermakos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:47:39