首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pinata的pinFileToIPFS方法不接受用户上传的文件

Pinata的pinFileToIPFS方法不接受用户上传的文件
EN

Stack Overflow用户
提问于 2022-01-19 14:18:29
回答 3查看 2.6K关注 0票数 0

我正在进行一个项目(使用React.js Express.js和Node.js),将用户上传的图像转换为Ethereum块链上的NFT,为此,我需要将图像上传到IPFS (我正在使用Pinata),然后使用元数据中的pinata URI来创建新的NFT。(如果我错了,请告诉我,我还是web3的新手)

为了将我的图像上传到Pinata,我将图像的base64字符串从客户端发送到服务器端,然后调用pinFileToIPFS方法。这是我的服务器端文件的代码

代码语言:javascript
复制
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()中,但我始终得到以下错误。

代码语言:javascript
复制
data: {
  error: 'This API endpoint requires valid JSON, and a JSON content-type'
}

我知道问题在于我的图像/文件被发送到API的格式,但我不知道。我仍然是web3和区块连锁店的新手,所以请帮助我!

EN

回答 3

Stack Overflow用户

发布于 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);

票数 0
EN

Stack Overflow用户

发布于 2022-04-16 20:10:17

当您使用节点js将图像或文件上载到Pinata IPFS时。这些步骤甚至不需要Pinata Node.js SDK。

1-你可以上传一个图像从前端与反应或Next.js。代码如下所示.

代码语言:javascript
复制
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-你需要安装穆特来上传图片.

代码语言:javascript
复制
const multer = require("multer");
global.uploadSingleFile = multer({ dest: "uploads/" });

3-使用您将要调用的multer中间件和操作设置您的路由。

代码语言:javascript
复制
 .post(
    "/attachments/upload",
    uploadSingleFile.single("file"),
    actions.attachments.upload.pinFileToIPFSLocal
  );

4-最后一步,您将使用Pinata和秘密键到达Pinata端点。

代码语言:javascript
复制
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);
    }
票数 0
EN

Stack Overflow用户

发布于 2022-05-20 04:23:51

错误信息是清楚的。您正在使用用于json文件上载的url。这是用于上传图像的url。

代码语言:javascript
复制
  const url = `https://api.pinata.cloud/pinning/pinFileToIPFS`;

  • 您不必将缓冲区转换为可读的流。

  • ,我不确定这是否正确,${formData._boundary}。应该是

“内容-类型”:multipart/form-data: boundary=${formData.getBoundary()}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70772228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档