如何在IPFS的JSON中存储并取回Blob?(Node.js+Pinata)
在Node.js中通过Pinata将Blob存入IPFS并还原为Blob对象
核心问题:JSON无法直接序列化Blob对象。当你调用pinata.pinJSONToIPFS()上传包含Blob的对象时,Blob会被序列化为空对象{},导致IPFS上仅存储空字段,取回后无法操作。
解决思路:先将Blob转换为JSON可兼容的格式(Base64字符串),同时保留Blob的类型信息;取回时再将Base64还原为Blob对象。
上传实现
const { Blob } = require('node:buffer'); // 创建目标Blob const myBlob = new Blob(["Hey"], { type: 'text/plain' }); // 将Blob转为Base64字符串 const arrayBuffer = await myBlob.arrayBuffer(); const buffer = Buffer.from(arrayBuffer); const blobBase64 = buffer.toString('base64'); // 构造可序列化的上传数据 const uploadPayload = { blobData: blobBase64, mimeType: myBlob.type }; // 上传到Pinata pinata.pinJSONToIPFS(uploadPayload) .then(result => console.log('上传完成:', result)) .catch(err => console.error('上传失败:', err));
取回并还原Blob
const { Blob } = require('node:buffer'); // 从IPFS获取数据 const res = await fetch('https://gateway.pinata.cloud/ipfs/你的IPFS哈希值'); const storedData = await res.json(); // 将Base64转回Buffer const buffer = Buffer.from(storedData.blobData, 'base64'); // 还原为Blob对象 const restoredBlob = new Blob([buffer], { type: storedData.mimeType }); // 验证结果 console.log(await restoredBlob.text()); // 输出: Hey
注意事项
- Node.js 18+原生支持Blob,低版本需安装
blob-polyfill包兼容。 - 必须保留Blob的
type属性,否则还原后的Blob无法正确识别数据类型。 - 若Blob体积较大,可考虑直接上传Blob文件到IPFS(使用
pinata.pinFileToIPFS),再将文件的IPFS哈希存入JSON,取回时通过哈希获取Blob。
内容的提问来源于stack exchange,提问作者NewToCode
相关产品推荐
相关产品推荐

