使用Pinata SDK上传可读流到IPFS报400及未处理拒绝问题求解
问题分析与修复方案
方案1问题及修正
问题原因
Pinata SDK的pinFileToIPFS方法仅兼容Node.js原生的Readable流,你传入的是浏览器环境下Blob生成的WHATWG标准ReadableStream,两类流API不匹配,Node.js流特有的on事件监听方法不存在,因此触发source.on is not a function报错。
修正代码
浏览器环境下使用SDK上传,直接将Blob转为File对象传入即可,无需转流:
// 可根据实际需求调整文件名和MIME类型 const myFile = new File([new Uint8Array(myBuffer)], "image.png", { type: "image/png" }); pinata.pinFileToIPFS(myFile) .then(res => console.log(res)) .catch(err => console.error(err));
方案2问题及修正
问题原因
Pinata的pinFileToIPFS公开接口要求formData中存储文件的字段名必须为file,你的代码中用了自定义字段名test,接口无法识别到上传的文件内容,因此返回400错误和Unexpected field提示。
修正代码
// 构造Blob时指定正确的MIME类型,避免后续识别异常 const myBlob = new Blob([new Uint8Array(myBuffer)], { type: "image/png" }); const myHeaders = new Headers(); myHeaders.append("pinata_api_key", "MY_KEY"); myHeaders.append("pinata_secret_api_key", "MY_SECRET_KEY"); const formdata = new FormData(); // 字段名必须为file,第三个参数指定文件名 formdata.append("file", myBlob, "image.png"); const requestOptions = { method: 'POST', headers: myHeaders, body: formdata, redirect: 'follow' }; fetch("https://api.pinata.cloud/pinning/pinFileToIPFS", requestOptions) .then(response => response.text()) .then(result => console.log('result',result)) .catch(error => console.log('error', error));
补充:如果需要从原始dataURL生成buffer,先去掉dataURL的类型前缀,对剩余内容做base64解码后再转Uint8Array即可。
内容的提问来源于stack exchange,提问作者Lasanja
相关产品推荐
相关产品推荐

