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.

Manipular archivo base64 en Expo.

Necesito manipular este archivo que obtengo en Base64 (descárgalo o compártelo):

const generatePDF = async () => {
const companyReponse = await CompanyService.getCompany();
const peopleResponse = await PeopleService.getPerson(sale.customerId);

const company = companyReponse.response.company;
const people = peopleResponse.response;
const quote = false;

const json = await SaleService.generatePDF({
  sale,
  company,
  people,
  quote,
});

await ensureFolderExists();

if (json && json.success) {
  const path = `${FileSystem.documentDirectory}MyFolder/Sale_${sale._id}.pdf`;

  await FileSystem.writeAsStringAsync(path, json.data, {
    encoding: FileSystem.EncodingType.Base64,
  });

  const url = `${FileSystem.documentDirectory}MyFolder/Sale_${sale._id}.pdf`;

  Linking.openURL(url);
}

};

Usando la cadena Base64 que devuelve, y buscando así en el navegador data:application/pdf;base64,${json.data}, incluso puedo verlo. Pero lo he intentado de varias maneras y ninguna ha funcionado, creo que esta puede estar más cerca del éxito.

[Unhandled promise rejection: Error: No se pudo abrir la URL ‘file:///data/user/0/host.exp.exponent/files/ExperienceData/%2540sensiogabriel%252FSensio/MyFolder/Sale_61a122679719d630dc416f91.pdf’: el archivo:///data/user/0/host.exp.exponent/files/ExperienceData/%2540sensiogabriel%252FSensio/MyFolder/Sale_61a122679719d630dc416f91.pdf se expone más allá de la aplicación a través de Intent.getData()]

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según el fragmento de código y el error proporcionado, parece que el problema está en abrir el archivo PDF generado desde un sistema de archivos local utilizando Linking.openURL (url).

    Una posible solución puede ser utilizar el método Expo.FileSystem.getContentUriAsync (fileUri) para obtener un URI de contenido para el archivo y luego utilizar Linking.openURL (contentUri) para abrir el archivo.

    Así es como se puede modificar el código:

    import * as Expo from 'expo';
    
    const generatePDF = async () => {
      const companyReponse = await CompanyService.getCompany();
      const peopleResponse = await PeopleService.getPerson(sale.customerId);
    
      const company = companyReponse.response.company;
      const people = peopleResponse.response;
      const quote = false;
    
      const json = await SaleService.generatePDF({
        sale,
        company,
        people,
        quote,
      });
    
      await ensureFolderExists();
    
      if (json && json.success) {
        const path = `${FileSystem.documentDirectory}MyFolder / Sale_ $ {sale._id} .pdf`;
    
        await FileSystem.writeAsStringAsync (path, json.data, {
          encoding: FileSystem.EncodingType.Base64,
        });
    
        const contentUri = await Expo.FileSystem.getContentUriAsync (path);
    
        Linking.openURL (contentUri);
      }
    };
    

    Tenga en cuenta que Expo.FileSystem.getContentUriAsync (fileUri) requiere que se pase una URI de archivo como argumento, que se puede obtener utilizando FileSystem.documentDirectory + 'MyFolder / Sale_' + sale._ id + '.pdf'.

    ¡Espero que esto ayude! Avísame si tienes más preguntas.

Comments are closed.