首页 > 解决方案 > pinFileToIPFS API 调用 S3 文件 URL

问题描述

我的文件是图片链接或任何其他文件链接。我试图调用pinata pinFileToIpfs API文档)。

根据documentaion,我必须传递本地文件的路径才能追加。但我有 AWS URL。如何仍然调用下面的 API?

let data = new FormData();
data.append('file', fs.createReadStream('./yourfile.png'));

注意:我也试过这个

 data.append('file', s3.getObject({Bucket: myBucket, Key: myFile})
.createReadStream());

但它没有成功。

标签: javascriptnode.jsamazon-s3ipfs

解决方案


我花了 3 天的时间,终于让它工作了。诀窍是您将很难将 Stream 直接发布到 Pinata API,因为它需要一个文件。我最终放弃了,把来自 S3 的 Stream 保存到服务器上的一个临时文件中,然后发送给 Pinata,然后删除了临时文件。这样可行。

try
{
    //Copy file from S3 to IPFS
    AmazonS3.AmazonS3Utility m = new AmazonS3.AmazonS3Utility();
    Stream myfile = m.GetObjectStream(fileName);

    using (var client = new RestClient("https://api.pinata.cloud"))
    {
        //Add IPFS Metadata
        JObject pinataOptions = new JObject(
               new JProperty("cidVersion", "0")
               );
        string pO = JsonConvert.SerializeObject(pinataOptions, Formatting.Indented);

        JObject pinataMetadata = new JObject(
               new JProperty("name", fileName),
               new JProperty("keyvalues",
                    new JObject(
                        new JProperty("file_url", FileUrl),
                        new JProperty("description", "")
                        )
               ));
        string pM = JsonConvert.SerializeObject(pinataMetadata, Formatting.Indented);

        string tempFile = AppDomain.CurrentDomain.BaseDirectory + @"temp\\" + fileName;
        long fileLength;
        using (FileStream outputFileStream = new FileStream(tempFile, FileMode.Create))
        {
            myfile.CopyTo(outputFileStream);
            fileLength = outputFileStream.Length;
        }

        var request = new RestRequest("/pinning/pinFileToIPFS", Method.Post);
        request.AddQueryParameter("pinata_api_key", your_APIKey);
        request.AddQueryParameter("pinata_secret_api_key", your_SecretAPIKey);
        request.AddParameter("pinataOptions", pO);
        request.AddParameter("pinataMetadata", pM);
        request.AddHeader("Authorization", your_Pinata_JWT);
        request.AddFile("file", tempFile, fileName);
        RestResponse response = await client.ExecutePostAsync(request);
        File.Delete(tempFile);
        return response.Content;
    }
}
catch { }

推荐阅读