Следить за ходом загрузки реакции-native-fs
Если для загрузки файла с URL-адреса использовать response -native-fs, когда процент загрузки достигнет 100%, я вызову другую функцию. Тем не мение, RNFS.downloadFile
не следить за ходом правильно.
_downloadFile = () =>{
const downloadDest = `${RNFS.ExternalDirectoryPath}/Monstro/${((Math.random() * 1000) | 0)}.jpg`;
let DownloadFileOptions = {
fromUrl: "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Boothferry_Road%2C_Goole.jpg/220px-Boothferry_Road%2C_Goole.jpg",
toFile: downloadDest,
begin: this._downloadFileBegin,
progress: this._downloadFileProgress,
background:false,
progressDivider:1
};
RNFS.downloadFile(DownloadFileOptions);
}
_downloadFileBegin = () =>{
console.log("Download Begin");
}
_downloadFileProgress = (data) =>{
const percentage = ((100 * data.bytesWritten) / data.contentLength) | 0;
const text = `Progress ${percentage}%`;
console.log(text);
if(percentage == 100) //call another function here
}
Не каждый раз console.log
в _downloadFileProgress
шоу Progress 100%
так что мне сложнее проверить прогресс. Я пропустил некоторые настройки, или есть какие-либо другие способы отслеживать прогресс
4 ответа
Привет я реализую с помощью этого, следуя рекомендациям RNFS npm
https://www.npmjs.com/package/react-native-fs
Для индикатора выполнения я использовал библиотеку
Реагируй на родной круг прогресса
downloadFile(options: DownloadFileOptions): { jobId: number, promise: Promise<DownloadResult> }
type DownloadFileOptions = {
fromUrl: string; // URL to download file from
toFile: string; // Local filesystem path to save the file to
headers?: Headers; // An object of headers to be passed to the server
background?: boolean; // Continue the download in the background after the app terminates (iOS only)
discretionary?: boolean; // Allow the OS to control the timing and speed of the download to improve perceived performance (iOS only)
cacheable?: boolean; // Whether the download can be stored in the shared NSURLCache (iOS only, defaults to true)
progressDivider?: number;
begin?: (res: DownloadBeginCallbackResult) => void;
progress?: (res: DownloadProgressCallbackResult) => void;
resumable?: () => void; // only supported on iOS yet
connectionTimeout?: number // only supported on Android yet
readTimeout?: number // supported on Android and iOS
};
Здесь я реализую выше строки кода, как это
RNFS.downloadFile({
fromUrl: encodedfileURL,
toFile: downloadfilePath,
//headers
background: true, **// Continue the download in the background after the app terminates (iOS only)**
discretionary: true, **// Allow the OS to control the timing and speed of the download to improve perceived performance (iOS only)**
cacheable: true, **// Whether the download can be stored in the shared NSURLCache (iOS only, defaults to true)**
begin: (res: DownloadBeginCallbackResult) => {
console.log("Response begin ===\n\n");
console.log(res);
},
progress: (res: DownloadProgressCallbackResult) => {
//here you can calculate your progress for file download
console.log("Response written ===\n\n");
let progressPercent = (res.bytesWritten / res.contentLength)*100; // to calculate in percentage
console.log("\n\nprogress===",progressPercent)
this.setState({ progress: progressPercent.toString() });
item.downloadProgress = progressPercent;
console.log(res);
}
})
.promise.then(res => {
console.log("res for saving file===", res);
return RNFS.readFile(downloadfilePath, "base64");
})
RNFS обеспечивает обратный вызов после завершения загрузки, попробуйте следующее:
RNFS.downloadFile(DownloadFileOptions).promise.then((r) => {
//call another function here
});
Вам нужно передать это как параметр прогресса в DownloadFileOptions:
progress: (data) => this._downloadFileProgress(data)
На самом деле, в библиотеке есть ошибка. когда вы передаете функцию и хотите использовать ход загрузки, чтобы показать что-то в пользовательском интерфейсе, вы ДОЛЖНЫ также передать функцию.
Я сказал, что это ошибка, потому чтоreact-native-fs
разработчики могли бы проверить это, если бы разработчик-потребитель прошелprogress
и не прошелbegin
они могут пройтиnoop
функционировать как опора по умолчанию.
const { jobId, promise } = FileSystem.downloadFile({
fromUrl: resource,
toFile: `${DOWNLOAD_DIR}/${utils.nameMaker()}.mp3`,
background: true,
discretionary: true,
cacheable: true,
begin: noop, // <===== this line I meant
progress: onProgress,
});
Вы можете прочитать здесь для получения дополнительной информации