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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:36:08