如何通过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
相关产品推荐
相关产品推荐

