React中如何通过Pinata的pinJsonToIpfs方法将多份NFT元数据存入同一目录?
Pinata wrapWithDirectory 机制说明及批量NFT元数据归档方案
你的当前代码
const metadata = { pinataContent: { name: nftItem.name, image: imageUrl, description: nftItem.description, external_url: nftItem.externalUrl, attributes: nftItem.attributes || [], }, pinataOptions: { wrapWithDirectory: nftList.length > 1 }, pinataMetadata: { name: `${nftItem.id}`, }, }; const pinataMetadata = await axios.post( 'https://api.pinata.cloud/pinning/pinJSONToIPFS', metadata, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${pinata.data.apiJwt}`, }, }, );
wrapWithDirectory 工作机制
- 当设置为
true时,Pinata不会直接上传单个文件,而是自动创建一个新目录,把你上传的文件放进这个目录,最终返回的IPFS哈希是这个目录的哈希,而非文件本身的哈希。 - 但你当前的遍历上传逻辑,即使开启这个选项,每个NFT元数据都会被包裹在独立的目录里,无法实现所有文件存到同一个文件夹的需求。
实现批量归档到同一文件夹的方案
要让所有NFT元数据存到Pinata的同一个文件夹,需要一次性上传整个目录结构,而非逐个上传文件:
// 1. 先构建包含所有NFT元数据的目录内容 const directoryContent = {}; nftList.forEach(nftItem => { // 用NFT的id作为文件名,方便识别和访问 directoryContent[`${nftItem.id}.json`] = { name: nftItem.name, image: imageUrl, description: nftItem.description, external_url: nftItem.externalUrl, attributes: nftItem.attributes || [], }; }); // 2. 配置Pinata上传参数 const metadata = { pinataContent: directoryContent, pinataOptions: { wrapWithDirectory: true }, pinataMetadata: { name: "NFT批量元数据目录", // 给目录命名,Pinata后台会显示这个名称 }, }; // 3. 一次性上传整个目录 const pinataResponse = await axios.post( 'https://api.pinata.cloud/pinning/pinJSONToIPFS', metadata, { headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${pinata.data.apiJwt}`, }, }, );
效果说明
- 上传完成后,Pinata后台会出现一个名为
NFT批量元数据目录的文件夹,里面包含所有NFT的元数据JSON文件。 - 你可以通过
IPFS目录哈希/${nftItem.id}.json的路径,访问单个NFT的元数据文件。
内容的提问来源于stack exchange,提问作者Егор Довыденко
相关产品推荐
相关产品推荐

