从服务器下载zip文件夹并尝试解压缩zip,但是该zip具有多个目录。我可以下载该zip文件,但无法解压缩。当zip文件包含多个图片文件,但在我的情况下,该文件包含多个目录和多个文件时,以下代码可以正常工作。
String _localZipFileName = 'archive.zip';
Future<File> _downloadFile(String url, String fileName) async {
//url==http://115.166.142.178:3000/staff/syncdata
var req = await http.Client().get(Uri.parse(url));
Log.e("DOWNLOAD DIRECTORY",_dir);
var file = File('$_dir/$fileName');
return file.writeAsBytes(req.bodyBytes);
}
Future<void> _downloadZip(String _zipPath) async {
setState(() {
_downloading = true;
});
Log.e("Zippath",_zipPath);
_images.clear();
_tempImages.clear();
var zippedFile = await _downloadFile(_zipPath, _localZipFileName);
Log.e("Zippath",zippedFile.path);
await unarchiveAndSave(zippedFile);
setState(() {
_images.addAll(_tempImages);
_downloading = false;
});
}
unarchiveAndSave(var zippedFile) async {
var bytes = zippedFile.readAsBytesSync();
var archive = ZipDecoder().decodeBytes(bytes);
for (var file in archive) {
var fileName = '$_dir/${file.name}';
if (file.isCompressed) {
var outFile = File(fileName);
Log.e('File:: ' , outFile.path);
// _tempImages.add('${outFile.path}/productImages');
outFile = await outFile.create(recursive: true);
await outFile.writeAsBytes(file.content);
}
}
}
答案 0 :(得分:0)
从未尝试在Dart中做到这一点,但是我在另一种语言中也遇到类似的问题。
通常,如果您忘记验证要处理的文件类型,就会出现此问题。
文件对象应具有布尔变量file.isFile
和file.isDirectory
您可以尝试遵循此example
import 'dart:io';
import 'package:path/path.dart' as p;
import 'package:path/path.dart';
import 'package:archive/archive.dart';
import 'package:archive/archive_io.dart';
var path = p.Context(style: Style.posix);
final String __filename = Platform.script.path.replaceFirst('/', '');
final String __dirname = Directory(__filename).parent.path;
// read Zip file from disk
List<int> bytes = File(path.join(__dirname, 'test-a-master.zip')).readAsBytesSync();
// decode Zip file
Archive archive = ZipDecoder().decodeBytes(bytes);
// Extract the contents of Zip compressed archive to disk
for (ArchiveFile file in archive) {
String filename = file.name;
String decodePath = path.join(__dirname, filename);
if (file.isFile) {
List<int> data = file.content;
File(decodePath)
..createSync(recursive: true)
..writeAsBytesSync(data);
} else {
Directory(decodePath)..create(recursive: true);
}
}
希望它将对您有帮助
答案 1 :(得分:0)
恐怕Dart可能不支持开箱即用地提取.zip文件。
我找到了一个用于处理zip提取的软件包:https://pub.dev/packages/archive/example
答案 2 :(得分:0)
存档包具有 extractFileToDisk 方法,可以满足您的需求。