无法在颤动中解压缩

时间:2020-05-18 12:04:38

标签: android ios flutter zip archive

从服务器下载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);
  }
}
  }

3 个答案:

答案 0 :(得分:0)

从未尝试在Dart中做到这一点,但是我在另一种语言中也遇到类似的问题。 通常,如果您忘记验证要处理的文件类型,就会出现此问题。 文件对象应具有布尔变量file.isFilefile.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 方法,可以满足您的需求。