Home > Mobile >  Upload a file to an IPFS node from Google Apps Script
Upload a file to an IPFS node from Google Apps Script

Time:11-23

I'm trying to upload a file to an IPFS node using Google Apps Script (GAS) without success. However, I was able to upload a file successfully using Postman. Unfortunately Postman only gives back the source code snippet closest to GAS as a JavaScript - Fetch code, which is not working as is in GAS.

In GAS, the authentication part is working and I know that because if I'm changing the bearer token, then I'm getting invalid credentials error instead of "Invalid request format".

Test code attached where I'm getting the "Invalid request format" error from the server.

For testing purpose, the file which needs to be uploaded, could be created on the fly with the script, but has to be one from Google Drive eventually.

function test() {
  
  let myHeaders = {'Authorization': 'Bearer ...'};
  let fileBlob = Utilities.newBlob('Hello!', 'text/plain', 'TestFile.txt');
  let formdata = {'file': fileBlob,
                  'pinataMetadata': {'name': 'TestFileNewName.txt','keyvalues': {'MetaData1': 'Test1', 'MetaData2': 'Test2'}},
                  'pinataOptions': {'cidVersion': 0}};

  let requestOptions = {
    method: 'post',
    headers: myHeaders,
    papyload: formdata,
    muteHttpExceptions: true
  };

  let url = "https://api.pinata.cloud/pinning/pinFileToIPFS";

  let response = UrlFetchApp.fetch(url, requestOptions);
  let responeText = JSON.parse(response.getContentText());

  Logger.log(responeText);
}

CodePudding user response:

If your access token of Bearer ... is the valid value for using the API, how about the following modification? From the official document, I thought that in the case of your formdata, the values of pinataMetadata and pinataOptions might be required to be the string type.

From:

let formdata = {'file': fileBlob,
                'pinataMetadata': {'name': 'TestFileNewName.txt','keyvalues': {'MetaData1': 'Test1', 'MetaData2': 'Test2'}},
                'pinataOptions': {'cidVersion': 0}};

To:

let formdata = {
  'file': fileBlob,
  'pinataMetadata': JSON.stringify({ 'name': 'TestFileNewName.txt', 'keyvalues': { 'MetaData1': 'Test1', 'MetaData2': 'Test2' } }),
  'pinataOptions': JSON.stringify({ 'cidVersion': 0 })
};

And also, please modify papyload: formdata, to payload: formdata,. This has already been mentioned by TheMaster's comment.

References:

  • Related