ipfs-http-client cat方法间歇性返回不完整文件求助
IPFS HTTP Client 文件检索间歇性截断问题修复
问题场景
使用ipfs-http-client上传base64图片后,通过CID检索时出现间歇性内容缺失:有时能获取完整的19.9kb base64字符串,有时仅得到缺失开头的11.8kb内容。尝试添加await或指定{offset: 0}参数均无效。
原代码
上传代码:
import { create } from "ipfs-http-client"; let client = create("/ip4/127.0.0.1/tcp/5001"); let file = await client.add(somebase64imagestring);
检索代码:
let iter = client.cat(imageCID); for await (let img of iterable) { const imgStr = Buffer.from(img).toString(); }
问题原因
client.cat()返回的是异步迭代器,每次迭代返回的是文件的一个数据分片(chunk)。原代码在循环中每次都重新赋值imgStr,仅保留了最后一个分片的内容,当文件被拆分为多个分片传输时,就会丢失前面的部分内容;而当文件刚好能在单个分片内传输时,就能获取完整内容,这就导致了间歇性的截断问题。
修复代码
需要将所有分片拼接起来,才能得到完整的文件内容:
const chunks = []; for await (const chunk of client.cat(imageCID)) { chunks.push(chunk); } const imgStr = Buffer.concat(chunks).toString();
如果允许引入工具库,也可以用更简洁的方式:
import all from 'it-all'; const chunks = await all(client.cat(imageCID)); const imgStr = Buffer.concat(chunks).toString();
额外优化建议
上传base64字符串时,建议先转换为Buffer,避免不必要的编码问题:
const imgBuffer = Buffer.from(somebase64imagestring, 'base64'); let file = await client.add(imgBuffer);
内容的提问来源于stack exchange,提问作者iPhoneJavaDev
相关产品推荐
相关产品推荐

