#javascript #react-native #filesystems #expo
#javascript #react-native #файловые системы #expo
Вопрос:
Добрый день всем, из примера, приведенного на веб-сайте expo: https://docs.expo.io/versions/latest/sdk/filesystem/?redirected#downloading-files
Я пытаюсь загрузить текстовый файл размером 8 Мб, который на самом деле загружается, но с определенными проблемами
- Я не знаю, как обрабатывать код приостановки и код возобновления, потому что он вызывается после завершения загрузки
- Я пытаюсь получить процент, основанный на ходе загрузки, но я не знаю, как получить процент, вместо этого я получаю загруженные килобайты
- Самое главное, как я могу вернуть файл обратно для чтения из него. Путь к файлу после завершения загрузки 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 в объект состояния, и я смог утешить. регистрируйте объект состояния. Следовательно, единственная проблема, с которой я сталкиваюсь, — это функция возобновления и функция паузы. Спасибо