'pinFileToIPFS API calling for S3 File URL

My file is image link or any other file link. I was trying to call pinata pinFileToIpfs API (Documentation).

According to documentaion , i have to pass path of local file for appending. But i have AWS URL. How to still call the below API?

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

NOTE : I tried this also

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

but it didnt worked out.



Solution 1:[1]

I spent 3 days on this and finally got it to work. The trick is that you will have a hard time POSTing a Stream directly to the Pinata API as it expects a File. I finally gave up and took the Stream coming from S3 and saved it to a temporary file on the server, then sent it to Pinata, then deleted the temp file. That works.

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 { }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Robert Barrueco