Я загружал zip-архив и распаковывал его на устройство, и я могу это сделать, но хочу показать прогресс загрузки
Future<void> _downloadZip(String _zipPath) async {
Log.e("Zippath",_zipPath);
var zippedFile = await _downloadFile(_zipPath, _localZipFileName);
await unarchiveAndSave(zippedFile);
setState(() {
_downloading = false;
});
}
Файл загрузки
Future<File> _downloadFile(String url, String fileName) async {
url="http://115.166.142.178:3000/Zipfile/download/attachment.zip/1";
var req = await http.Client().get(Uri.parse(url));
Log.e("DOWNLOAD DIRECTORY",_dir);
var file = File('$_dir/$fileName');
return file.writeAsBytes(req.bodyBytes);
}
Разархивировать и сохранить файл на устройство
unarchiveAndSave(File zippedFile) async {
var bytes = zippedFile.readAsBytesSync();
var archive = ZipDecoder().decodeBytes(bytes);
for (var file in archive) {
var fileName = '$_dir/${file.name}';
Log.e('File:: ' ,fileName);
if (file.isFile) {
var outFile = File(fileName);
Log.e('File:: ' ,outFile.path);
_tempImages.add(outFile.path);
outFile = await outFile.create(recursive: true);
await outFile.writeAsBytes(file.content);
}
}
}
Создание каталога
if (null == _dir) {
if(Platform.isAndroid){
_dir = (await getExternalStorageDirectory()).path;
}else{
_dir = (await getApplicationDocumentsDirectory()).path;
}
}
HTTP-клиент возвращает мне var req = await http.Client().get(Uri.parse(url));
a Future<Response>
, поэтому я не могу увидеть прогресс загрузки и попытаться преобразовать в поток, что дает мне ошибку readAsBytesSync was called on null
здесь Ответ @CopsOnRoad работает, но при записи файла с использованием метода unarchiveAndSave
дает readAsBytesSync was called on null
, потому что readAsBytesSync
вызывается на Unit8List
, а поток дает List<Int>
abd пытается преобразовать в Unit8List
, но ничего не работает
с использованием потока
Future<File> _downloadFile(String url, String fileName) async {
_response = await http.Client().send(http.Request('GET', Uri.parse(url)));
_total = _response.contentLength;
_response.stream.listen((value) {
setState(() {
_bytes.addAll(value);
_received += value.length;
});
}).onDone(() async {
Log.e("DONE","DOWNLOAD");
Uint8List ubytes = Uint8List.fromList(_bytes);
var file = File('$_dir/$fileName');
return file.writeAsBytes(ubytes);
});
}