首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在NodeJS中将上传的文件保存到Pinata IPFS中

在NodeJS中将上传的文件保存到Pinata IPFS中
EN

Stack Overflow用户
提问于 2021-12-02 16:09:12
回答 1查看 976关注 0票数 1

我一直试图将上传的图像文件保存到NodeJs中的IPFS中,虽然皮纳塔似乎保存了这些文件,但这些文件几乎是胡说八道(下载后图像被破坏了)。

我的代码:

代码语言:javascript
复制
// Nodejs route.
exports.postImage = async (req, res, next) => {
    // Using multer to get the file.
    fileUploadMiddleware(req, res, async (err) => {
        // getting bunch of data from query string.
        let meta = {
            origin,
            originid,
            context,
            ownerid,
            format
        } = req.query;

        if(!meta.format || !req.files) {
            return next(new ErrorResponse("File format not specified", 404));
        }

        if(!meta.originid) {
            meta.originid = uuidv4();
        }        
        
        // NOTE: is this the right way to get the data of the file ?
        const buffer = req.files[0].buffer;
        
 const filename = `${metadata.origin}_${metadata.originid}.${ metadata.format }`;

    let stream;
    try {
        stream = Readable.from(buffer);
        // HACK to make PINATA WORK.
        stream.path = filename;
    }
    catch(e) {
        logger.logError(e);
        return false;
    }

    const options = {
        pinataMetadata: {
            name: filename,
            keyvalues: {
                context: metadata.context,
                ownerid: metadata.ownerid
            }
        },
        pinataOptions: {
            cidVersion: 0
        }
    };

    try {
        var result = await pinata.pinFileToIPFS(stream, options);
        console.log("SUCCESS ", result);

        return result;
    }
    catch(e) {
        logger.logError(e);
        return null;
    }

        res.status(200).json({
            success: true,
            data: 'You got access'
        })
    });
}

因此,基本上是基于上传的文件缓冲区创建流,并将其发送到Pinata。我哪里出问题了?

EN

回答 1

Stack Overflow用户

发布于 2022-05-20 04:10:49

代码语言:javascript
复制
const buffer = req.files[0].buffer;

如果你使用MemoryStorage。缓冲区属性将可用。它不能用于diskStorage,因为它将在本地保存该文件。

代码语言:javascript
复制
const storage = multer.memoryStorage()
const upload = multer({ storage: storage })

而且我认为这不是req.files[0]

代码语言:javascript
复制
const buffer = req.file.buffer;

获得缓冲区后,使用FormData npm包将其转换为表格数据

代码语言:javascript
复制
   import FormData from "form-data";

   const formData = new FormData();
      formData.append("file", buffer, {
         contentType,
        filename: fileName + "-" + uuidv4(),
      });

然后你给皮纳塔发了个邮件请求

代码语言:javascript
复制
  const url = `https://api.pinata.cloud/pinning/pinFileToIPFS`;
  const fileRes = await axios.post(url, formData, {
    maxBodyLength: Infinity,
    headers: {
      // formData.getBoundary() is specific to npm package. native javascript FormData does not have this method
      "Content-Type": `multipart/form-data: boundary=${formData.getBoundary()}`,
      pinata_api_key: pinataApiKey,
      pinata_secret_api_key: pinataSecretApiKey,
    },
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70202856

复制
相关文章

相似问题

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