如何用ipfs-http-client生成带.glb后缀的IPFS链接?
解决IPFS上传单个GLB文件生成带后缀链接的问题
核心解决方案
当使用wrapWithDirectory: true时,必须显式指定带后缀的文件名,并从上传结果中提取根目录CID,再拼接文件名得到完整的带后缀IPFS链接。
具体代码实现
const { create } = require('ipfs-http-client'); const fs = require('fs'); async function uploadGLBFile() { // 初始化IPFS客户端,替换为你的节点地址 const ipfs = create({ url: 'http://localhost:5001/api/v0' }); // 读取本地GLB文件 const glbFilePath = './your-3d-model.glb'; const fileContent = fs.readFileSync(glbFilePath); // 上传文件,指定带后缀的文件名并开启目录包装 const uploadResults = await ipfs.add( { path: 'nft-model.glb', // 这里设置带.glb后缀的文件名 content: fileContent }, { wrapWithDirectory: true } ); // 从结果中筛选出根目录的CID(path为空字符串的条目) const rootDirCid = uploadResults.find(item => item.path === '').cid.toString(); // 拼接得到带后缀的IPFS链接 const validIpfsUrl = `ipfs://${rootDirCid}/nft-model.glb`; console.log('可被OpenSea识别的GLB文件链接:', validIpfsUrl); } // 执行上传 uploadGLBFile().catch(error => console.error('上传失败:', error));
关键细节说明
- 为什么之前
result.path为空?
开启wrapWithDirectory: true后,ipfs.add会返回一个数组,包含两个条目:一个是文件本身(path为你指定的文件名),另一个是根目录(path为空字符串)。你需要遍历数组找到根目录的CID,而不是直接取单个结果的path。 - 文件名的重要性:
必须在上传时指定带.glb后缀的文件名,这样IPFS目录中会保留这个后缀,拼接后的链接才能被OpenSea识别为3D模型文件。 - 验证链接:
生成链接后,可通过IPFS网关(如https://ipfs.io/ipfs/${rootDirCid}/nft-model.glb)测试访问,确认文件能正常加载。
内容的提问来源于stack exchange,提问作者Mouloud85
相关产品推荐
相关产品推荐

