我正在进行一个项目(使用React.js Express.js和Node.js),将用户上传的图像转换为Ethereum块链上的NFT,为此,我需要将图像上传到IPFS (我正在使用Pinata),然后使用元数据中的pinata URI来创建新的NFT。(如果我错了,请告诉我,我还是web3的新手)
为了将我的图像上传到Pinata,我将图像的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和区块连锁店的新手,所以请帮助我!
发布于 2022-02-05 23:30:45
您可能需要考虑更改以下两行并使用https://api.pinata.cloud/pinning/pinFileToIPFS端点:
const buffer = Buffer.from(image); -> const buffer = Buffer.from(image, "base64");
和
formData.append("file", stream); -> formData.append("file", stream, "fileNameOfChoiche.png);
发布于 2022-04-16 20:10:17
当您使用节点js将图像或文件上载到Pinata IPFS时。这些步骤甚至不需要Pinata Node.js SDK。
1-你可以上传一个图像从前端与反应或Next.js。代码如下所示.
const uploadAttachment = async (data, token) => {
try {
return await Api.post(`${ApiRoutes.upload_attachment}`, data, {
headers: {
Authorization: "Bearer " + token, //the token is a variable which holds the token
},
});
} catch (error) {
return {
status: 404,
};
}
};
export default uploadAttachment;2-你需要安装穆特来上传图片.
const multer = require("multer");
global.uploadSingleFile = multer({ dest: "uploads/" });3-使用您将要调用的multer中间件和操作设置您的路由。
.post(
"/attachments/upload",
uploadSingleFile.single("file"),
actions.attachments.upload.pinFileToIPFSLocal
);4-最后一步,您将使用Pinata和秘密键到达Pinata端点。
pinFileToIPFSLocal: async (req, res, next) => {
try {
const url = "https://api.pinata.cloud/pinning/pinFileToIPFS";
let formData = new FormData();
formData.append("file", JSON.stringify(req.file), req.file.originalname);
axios
.post(url, formData, {
maxContentLength: -1,
headers: {
"Content-Type": `multipart/form-data; boundary=${formData._boundary}`,
pinata_api_key: process.env.PINATA_API_KEY,
pinata_secret_api_key: process.env.PINATA_API_SECRET,
path: "somename",
},
})
.then((data) => {
console.log("Result...", data);
return utils.response.response(
res,
"Upload image to ipfs.",
true,
200,
data.data
);
})
.catch((err) => {
return utils.response.response(
res,
"Image not upload to ipfs",
false,
200,
err
);
});
} catch (error) {
next(error);
}发布于 2022-05-20 04:23:51
错误信息是清楚的。您正在使用用于json文件上载的url。这是用于上传图像的url。
const url = `https://api.pinata.cloud/pinning/pinFileToIPFS`;,
${formData._boundary}。应该是“内容-类型”:multipart/form-data: boundary=${formData.getBoundary()},
https://stackoverflow.com/questions/70772228
复制相似问题