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

使用Node Multer内存存储将Buffer转Blob转Base64存入PgSQL bytea问题

问题解决方案

你完全不需要中转Blob,也不需要手动切割ArrayBuffer,multer内存存储返回的req.file.buffer本身就是包含完整图片二进制数据的Node.js Buffer实例,直接就能转base64,你之前的代码出错是多余的Buffer切割操作导致数据损坏。

错误点说明

  • 你写的photoBuffer.buffer.slice操作是不必要的,Node.js Buffer的.buffer属性指向的底层ArrayBuffer可能包含额外的填充数据,偏移计算错误就会导致图片数据不完整
  • Blob是浏览器端的API,Node.js原生环境(v18以下)默认没有全局Blob实现,这一步转换完全是多余操作,对服务端处理二进制数据没有任何帮助

正确实现代码

import { Router, Request, Response } from 'express'
import multer from 'multer'

const storage = multer.memoryStorage()
// 可选添加文件类型校验避免非图片上传
const upload = multer({ 
  storage: storage,
  fileFilter: (req, file, cb) => {
    if (file.mimetype.startsWith('image/')) {
      cb(null, true)
    } else {
      cb(new Error('只允许上传图片文件'), false)
    }
  }
})
const api = Router()

api.post('/customer/:customer_id/photo', upload.single('photo'),
    async (req: Request, res: Response) => {
    try {
      const customerId = req.params.customer_id
      const photoBuffer = req?.file?.buffer as Buffer
      if (!photoBuffer) {
        return res.status(400).json({ msg: '未获取到上传的图片文件' })
      }

      // 直接转base64,不需要任何中间转换
      const base64Photo = photoBuffer.toString('base64')

      // 补充:如果用官方pg库操作PgSQL,其实可以直接存photoBuffer到bytea字段,不需要转base64,Pg驱动会自动处理映射,存储空间占用更小
      // 示例写法:await pgQuery('INSERT INTO customer_photos (customer_id, photo) VALUES ($1, $2)', [customerId, photoBuffer])

      // 你的数据库存储逻辑
      // ...

      res.status(200).json({ msg: '上传成功' })
    } catch (err) {
      res.status(500).json({ msg: '上传失败', error: (err as Error).message })
    }
  }
)

额外说明

如果后续需要返回base64图片给前端展示,只需要给base64加上对应MIME类型的前缀即可,格式为:data:${req.file.mimetype};base64,${base64Photo}。
内容的提问来源于stack exchange,提问作者Franz Noel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:12:04