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

Prisma查询PostgreSQL bytea字段转Blob或JS读取Buffer方法

Prisma 对接 PostgreSQL 的 Bytes(对应库表bytea类型)字段时,默认返回 Node.js 原生的 Buffer 实例,你看到的 {"type":"Buffer","data":[104,101,108,108,111]} 是 Buffer 被 JSON.stringify 序列化后的标准输出,不需要做复杂的自定义解析,按以下方式处理即可:

转换为Blob返回前端

在Node.js服务端(Express、Next.js、Koa等运行环境)可以直接将Buffer转为Blob返回,注意要根据文件实际类型指定MIME值,避免前端识别文件出错:

  • 直接使用Prisma查询结果(未经过JSON序列化/反序列化流程)的场景:
// 查询目标文件记录
const fileRecord = await prisma.files.findUnique({
  where: { id: 1 }
})

// 生成Blob,type替换为文件实际MIME,比如image/png、application/pdf、text/csv等
const fileBlob = new Blob([fileRecord.file], {
  type: 'application/octet-stream' // 未知类型二进制文件默认用该值
})

// 接口返回时设置响应头,触发浏览器下载行为
return new Response(fileBlob, {
  headers: {
    'Content-Disposition': `attachment; filename="${encodeURIComponent(fileRecord.title || '未命名文件')}"`
  }
})
  • 如果拿到的是已经被序列化后的普通对象(即你贴出的带type、data字段的结构),先还原为Buffer再生成Blob:
const recoverBuffer = Buffer.from(fileRecord.file.data)
const fileBlob = new Blob([recoverBuffer], { type: 'application/octet-stream' })
直接在JavaScript中读取Buffer数据

Buffer原生提供了多场景的读取API,常用操作如下:

  • 读取文本内容:指定编码调用toString方法即可,你示例中的字节数组[104,101,108,108,111]转UTF-8文本结果为hello
    const textContent = fileRecord.file.toString('utf-8')
    
  • 转Base64字符串:可用于拼接Data URL,直接内嵌到前端页面做图片/文件预览
    const base64Str = fileRecord.file.toString('base64')
    const dataUrl = `data:对应文件MIME类型;base64,${base64Str}`
    
  • 获取原始二进制数据:支持下标直接访问字节值,也可提取ArrayBuffer供前端Web API使用
    // 读取指定位置字节值
    const firstByte = fileRecord.file[0]
    // 提取ArrayBuffer
    const arrayBuffer = fileRecord.file.buffer.slice(
      fileRecord.file.byteOffset,
      fileRecord.file.byteOffset + fileRecord.file.byteLength
    )
    

提示:不要手动遍历字节数组拼接二进制内容,直接使用Buffer原生API性能更高,也能避免编码、字节偏移类的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:48:20