Как загрузить текстовый файл с помощью файловой системы expo

#javascript #react-native #filesystems #expo

#javascript #react-native #файловые системы #expo

Вопрос:

Добрый день всем, из примера, приведенного на веб-сайте expo: https://docs.expo.io/versions/latest/sdk/filesystem/?redirected#downloading-files

Я пытаюсь загрузить текстовый файл размером 8 Мб, который на самом деле загружается, но с определенными проблемами

  1. Я не знаю, как обрабатывать код приостановки и код возобновления, потому что он вызывается после завершения загрузки
  2. Я пытаюсь получить процент, основанный на ходе загрузки, но я не знаю, как получить процент, вместо этого я получаю загруженные килобайты
  3. Самое главное, как я могу вернуть файл обратно для чтения из него. Путь к файлу после завершения загрузки file:///data/user/0/host.exp.exponent/files/ExperienceData/%40timotech%2Fwabpreader/Basic Technology for Junior Secondary Schools, Book 3.txt

Возникает ошибка: [Отклонение необработанного обещания: ошибка типа: неопределенный не является объектом (оценка ‘FileSystem.Типы кодирования.UTF8’)]

Пожалуйста, проверьте мой код ниже:

   componentDidMount() {
     this.downloadEbook();
  }

  downloadEbook = async () => {
    //Get download progress
    const callback = (downloadProgress) => {
    const progress =
      downloadProgress.totalBytesWritten /
      downloadProgress.totalBytesExpectedToWrite;
    this.setState({
      downloadProgress: progress, //showing in kilobytes
    });
    console.log(progress);
  };

  //Gets the text file
  const downloadResumable = FileSystem.createDownloadResumable(
    "http://books.timotechng.com/images/compressed/Basic Technology for Junior  Secondary Schools, 
    Book 3.txt",
    FileSystem.documentDirectory  
      "Basic Technology for Junior  Secondary Schools, Book 3.txt",
    {},
    callback
  );

  try {
    this.setState({ isLoading: true }); //shows activityindicator while download is going on
    const { uri } = await downloadResumable.downloadAsync();
    console.log("Finished downloading to ", uri);
    this.setState({ isLoading: false });
  } catch (e) {
    console.error(e);
  }

  //I don't know how to handle this, its being called after download finishes
  try {
    await downloadResumable.pauseAsync();
    console.log("Paused download operation, saving for future retrieval");
    AsyncStorage.setItem(
      "pausedDownload",
      JSON.stringify(downloadResumable.savable())
    );
  } catch (e) {
    console.error(e);
  }

  //I don't know how to handle this, its being called after download finishes
  try {
    const { uri } = await downloadResumable.resumeAsync();
    console.log("Finished downloading to ", uri);
  } catch (e) {
    console.error(e);
  }
};


//Code to get the file after download
 readEbook = async () => {
   // const filePath = this.state.filePath;
   // const assetInfo = await MediaLibrary.getAssetInfoAsync(filePath);
   // console.log(assetInfo);

  let tmp = await FileSystem.getInfoAsync(
    FileSystem.documentDirectory  
      "Basic Technology for Junior  Secondary Schools, Book 3.txt"
  );
  if (tmp.exists) {
    console.log("file exists");
    console.log(tmp);
    //let filename = FileSystem.documentDirectory   "userData.txt";
    let file = await FileSystem.readAsStringAsync(tmp.uri, {
      encoding: FileSystem.EncodingTypes.UTF8,
    });
    //Error occurs here: [Unhandled promise rejection: TypeError: undefined is not an object 
 (evaluating 'FileSystem.EncodingTypes.UTF8')]
    console.log("file", file);
  }
};
 

Между тем файл существует из этой распечатки:

 file exists
Object {
  "exists": true,
  "isDirectory": false,
  "modificationTime": 1611246702,
  "size": 8744195,  
  "uri":
 

«file:///data/user/0/host.exp.exponent/files/ExperienceData/%40timotech%2Fwabpreader/Basic Technology for Junior Secondary Schools, Book 3.txt» ,
}

 //Display of percentage
 return this.state.isLoading ? (
   <View style={{ marginTop: 20 }}>
     <ActivityIndicator
       size="large"
       color="#00ff00"
       animating={this.state.isLoading}
     />
     <Text style={{ justifyContent: "center", textAlign: "center" }}>
       Downloading file for first time use at {this.state.downloadProgress}%
     </Text>
   </View>
 )...
 

Спасибо за вашу помощь, извините, что мои коды такие длинные

Тим

Комментарии:

1. В соответствии с чтением текстового файла мне удалось устранить ошибку: [Отклонение необработанного обещания: ошибка типа: неопределенный не является объектом (оценка ‘FileSystem. Типы кодирования. UTF8’)] с помощью строки: let file = await FileSystem.readAsStringAsync(tmp.uri, { encoding: ‘utf8’, });

2. Теперь проблема заключается в том, что когда я хочу распечатать содержимое файла с помощью console.log (file), я получаю PayloadTooLargeError: объект запроса слишком большой

3. Хорошо, наконец, я смог преодолеть вторую ошибку: ошибка слишком большой полезной нагрузки. Это была консоль. проблема журнала с переменной file. Итак, я передал переменную file в объект состояния, и я смог утешить. регистрируйте объект состояния. Следовательно, единственная проблема, с которой я сталкиваюсь, — это функция возобновления и функция паузы. Спасибо