es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Sube un archivo a un nodo de IPFS desde Google Apps Script.

Estoy intentando subir un archivo a un nodo de IPFS utilizando Google Apps Script (GAS) sin éxito. Sin embargo, pude subir un archivo exitosamente usando Postman. Desafortunadamente, Postman solo devuelve el fragmento de código fuente más cercano a GAS como un código Fetch de JavaScript, que no funciona como está en GAS.

En GAS, la parte de autenticación está funcionando y lo sé porque si cambio el token portador, obtengo un error de credenciales inválidas en lugar de “Formato de solicitud no válido”.

Se adjunta código de prueba donde obtengo el error “Formato de solicitud no válido” del servidor.

Con fines de prueba, el archivo que debe cargarse podría crearse sobre la marcha con el script, pero eventualmente debe ser uno de Google Drive.

“`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);
}“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código proporcionado parece ser un error tipográfico en la propiedad payload del objeto requestOptions. Actualmente está escrito como papyload. Corregir este error debería resolver el error “Formato de solicitud no válido”.

    Además, como el archivo finalmente debe cargarse desde Google Drive, deberá modificar la variable fileBlob para obtener el contenido del archivo de un archivo en Google Drive en lugar de crear un nuevo archivo blob con algún texto. Aquí hay un ejemplo de cómo puede modificarlo:

    let fileId = "INSERT_FILE_ID_HERE"; // Reemplazar con el ID de archivo real que desea cargar
    let file = DriveApp.getFileById(fileId);
    let fileBlob = file.getBlob();
    

    Con estos cambios, el código final debería verse algo así:

    function test() {
    
      let myHeaders = {'Authorization': 'Bearer ...'};
    
      let fileId = "INSERT_FILE_ID_HERE"; // Reemplazar con el ID de archivo real que desea cargar
      let file = DriveApp.getFileById(fileId);
      let fileBlob = file.getBlob();
    
      let formdata = {'file': fileBlob,
                      'pinataMetadata': {'name': 'TestFileNewName.txt',
                                         'keyvalues': {'MetaData1': 'Test1',
                                                       'MetaData2': 'Test2'}},
                      'pinataOptions': {'cidVersion': 0}};
    
      let requestOptions = {
        method: 'post',
        headers: myHeaders,
        payload: 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);
    }
    

Comments are closed.