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

如何通过CID从IPFS恢复图片等文件,解决获取后无法打开问题

问题原因

你当前代码的核心问题是将二进制Uint8Array类型的块直接拼接为字符串,图片属于二进制文件,强制转字符串的过程会出现字节丢失、编码异常,导致最终写入的文件损坏无法打开。同时ipfs.get返回的是IPFS条目对象(包含目录、文件等类型),不能直接读取内容作为文件块处理。

正确实现方案

方案1:使用ipfs.cat(更适合获取单文件内容)

ipfs.cat是专门用于直接获取文件二进制内容的接口,写法更简洁:

const fs = require('fs')
const cid = '替换为你的实际CID'

const chunks = []
// 遍历读取二进制内容块
for await (const chunk of ipfs.cat(cid)) {
  chunks.push(chunk)
}
// 合并所有Uint8Array块为完整二进制Buffer
const fileBuffer = Buffer.concat(chunks)
// 直接写入二进制数据,无需转字符串
fs.writeFileSync('./img.jpg', fileBuffer)

方案2:修复ipfs.get的写法

如果要使用ipfs.get,需要先判断条目类型,再读取文件的内容流:

const fs = require('fs')
const cid = '替换为你的实际CID'

const chunks = []
for await (const entry of ipfs.get(cid)) {
  // 只处理文件类型的条目,跳过目录类条目
  if (entry.type === 'file') {
    for await (const chunk of entry.content) {
      chunks.push(chunk)
    }
  }
}
const fileBuffer = Buffer.concat(chunks)
fs.writeFileSync('./img.jpg', fileBuffer)
浏览器环境补充

如果是在浏览器端使用无需调用文件写入接口,可直接将合并后的二进制数据转为图片链接使用:

const blob = new Blob([fileBuffer], { type: 'image/jpeg' })
const imgUrl = URL.createObjectURL(blob)
// 赋值给img标签的src属性即可正常显示图片
document.querySelector('img').src = imgUrl

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:54:04