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.

React-Native-fs no puede abrir mi URI desde document-picker.

Selecciono un archivo a través de DocumentPicker, obtengo su URI y lo paso a una función que debería abrir mi documento (csv). Pero obtengo el Error ENSCOCOAERRORDOMAIN260.
Además, intenté ver si hay un archivo, pero no lo hay. Sin embargo, lo seleccioné a través de DocumentPicker (obtengo el nombre de archivo, tamaño, etc. a través de esto).

Esta sería la función:

async readCSVsaveTOJson(uri){
    var RNFS = require('react-native-fs');

    realDoc = uri.replace('file:/', '');
    console.log(realDoc);
    var kacke = '';
    var counter = 0;
    for(var i in realDoc){
        if(counter > 0){
            kacke += realDoc[i];
        }
        counter++;
    }

    console.log('¿existe?');
    console.log(RNFS.exists(kacke));

    RNFS.readDir(kacke)
    .then((result) => {
        console.log('resultado');
        return Promise.all([RNFS.stat(result[0].path), result[0].path]);
    })
    .then((statResult) => {
        if (statResult[1].isFile()) {
            var content = RNFS.readFile(kacke);
            console.log('--------------------------');
            console.log(content);
            return RNFS.readFile(statResult[1], 'utf8');
        }
        return 'no hay archivo';
    })
    .then((contents) => {
        console.log(contents);
    })
    .catch((err) => {
        console.log('ERROR, no hay nada');
        console.log(err.message, err.code);
    });
}

Lanza console.log('ERROR, no hay nada').. pero sé que debería haber algo.

¿Algún consejo?
Muchas gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la forma en que manejas la URI del archivo seleccionado. Al pasar la URI a la función readCSVsaveTOJson, asegúrate de manejar correctamente la URI para extraer la ruta real del archivo. Es posible que el formato de la URI en tu dispositivo sea diferente al que esperas.

    Actualmente estás utilizando la función replace para eliminar el prefijo file:/, lo cual puede que no sea suficiente. En su lugar, puedes intentar utilizar la función decodeURI() para extraer la ruta del archivo de la URI. Aquí tienes una versión actualizada de tu código:

    async readCSVsaveTOJson(uri) {
      const RNFS = require('react-native-fs');
      const decodedUri = decodeURI(uri);
    
      console.log('exists?');
      console.log(await RNFS.exists(decodedUri)); // use await to get the result of RNFS.exists
    
      RNFS.readDir(decodedUri)
        .then((result) => {
          // stat the first file
          console.log('result');
          return Promise.all([RNFS.stat(result[0].path), result[0].path]);
        })
        .then((statResult) => {
          if (statResult[1].isFile()) {
            // if we have a file, read it
            var content = RNFS.readFile(decodedUri);
            console.log('--------------------------');
            console.log(content);
            return RNFS.readFile(statResult[1], 'utf8');
          }
    
          return 'no file';
        })
        .then((contents) => {
          // log the file contents
          console.log(contents);
        })
        .catch((err) => {
          console.log('ERROR, no hay nada');
          console.log(err.message, err.code);
        });
    }
    

    En este código actualizado, primero decodificas la URI utilizando decodeURI() para obtener la ruta del archivo. Luego, utilizas await RNFS.exists(decodedUri) para verificar si el archivo existe, lo cual devolverá un valor booleano. Finalmente, pasas decodedUri a las funciones RNFS.readDir() y RNFS.readFile() para leer el contenido del archivo.

    Si esto aún no funciona, asegúrate de tener los permisos necesarios para leer el archivo seleccionado. En iOS, necesitas agregar la clave NSDocumentsFolderUsageDescription a tu archivo Info.plist, y en Android, necesitas solicitar el permiso READ_EXTERNAL_STORAGE.

Comments are closed.