【发布时间】:2022-04-23 23:04:06
【问题描述】:
我正在开发一个项目(使用 React.js Express.js 和 Node.js)将用户上传的图像转换为以太坊区块链上的 NFT,为此,我需要将图像上传到 IPFS(我是使用 Pinata),然后使用元数据中的 pinata URI 来铸造一个新的 NFT。 (如果我在这里错了,请告诉我,我还是 web3 的新手)
为了将我的图像上传到 Pinata IPFS,我将图像的 base64 字符串从客户端发送到服务器端,然后调用 pinFileToIPFS 方法。这是我的服务器端文件的代码
const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');
const router = require('express').Router();
const { Readable } = require('stream');
const pinFileToIPFS = (image) => {
const url = `https://api.pinata.cloud/pinning/pinJSONToIPFS`;
const buffer = Buffer.from(image);
const stream = Readable.from(buffer);
const filename = `an-awesome-nft_${Date.now()}.png`;
stream.path = filename;
const formData = new FormData();
formData.append("file", stream);
return axios.post(url,
formData,
{
headers: {
'Content-Type': `multipart/form-data; boundary= ${formData._boundary}`,
'pinata_api_key': "*******************",
'pinata_secret_api_key': "**********************************",
}
}
).then(function (response) {
console.log("Success: ", response);
}).catch(function (error) {
console.log("Fail! ", error.response.data);
});
};
router.route('/').post((req, res) => {
const image = req.body.image;
pinFileToIPFS(image);
});
module.exports = router;
这里req.body.image 包含用户上传文件的base64 字符串。
我试图将base64字符串转换为缓冲区,然后将缓冲区转换为可读流(如官方Pianata文档中所做的那样,但对于本地文件),然后将其包装在FormData()中,但我不断收到以下信息错误。
data: {
error: 'This API endpoint requires valid JSON, and a JSON content-type'
}
我知道问题出在我的图像/文件发送到 API 的格式上,但我不知道。我还是 web3 和区块链的新手,所以请帮忙!
【问题讨论】:
标签: javascript node.js reactjs mern ipfs