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

使用JavaScript向IPFS上传对象报Input not supported错误怎么办

问题现象

上传对象到IPFS时触发类型不匹配报错,错误信息:

Input not supported. Expected Buffer|ReadableStream|PullStream|File|Array<Object> got object

触发报错的原始代码:

let data = {
  name: bot,
  description: "",
  image: "https://ipfs.infura.io/ipfs/myimagehash",
};

const client = ipfsClient({
  host: "ipfs.infura.io",
  port: 5001,
  protocol: "https",
});

try {
  const added = await client.add(data);
  const url = `https://ipfs.infura.io/ipfs/${added[0].path}`;
  return url;
} catch (error) {
  console.log("Error uploading file: ", error);
}
报错原因

ipfs-client的add方法不支持直接传入无结构的普通JS对象,方法要求入参必须是以下类型之一:Buffer、ReadableStream、PullStream、File实例、符合UnixFS规范的带content字段的对象/对象数组。直接传入裸的普通对象就会触发上述类型校验错误。

修复方法

如果要上传JSON格式的元数据,先把普通JS对象序列化为JSON字符串,再转成Buffer作为内容传入即可,修复后的代码如下:

let data = {
  name: bot,
  description: "",
  image: "https://ipfs.infura.io/ipfs/myimagehash",
};

const client = ipfsClient({
  host: "ipfs.infura.io",
  port: 5001,
  protocol: "https",
});

try {
  // 序列化对象为Buffer
  const content = Buffer.from(JSON.stringify(data));
  // 传入带content字段的合规对象,可指定path后缀为.json方便网关识别内容类型
  const added = await client.add({
    content: content,
    path: "metadata.json"
  });
  // 注意:新版本ipfs-client单文件add直接返回文件对象,无需取[0],老版本数组格式可按需兼容
  const url = `https://ipfs.infura.io/ipfs/${added.path}`;
  return url;
} catch (error) {
  console.log("Error uploading file: ", error);
}

补充说明

  • 序列化后上传是兼容性最好的方案,支持所有版本的IPFS客户端
  • 如果需要上传多个文件到同一个目录,可以传入对象数组,每个对象都必须包含path和content字段
  • 不要省略JSON序列化步骤,依赖隐式类型转换处理对象会导致元数据格式损坏,后续无法正常解析

内容的提问来源于stack exchange,提问作者hora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:57:23