如何使用archive.dart访问压缩包子目录中的文件
使用archive_io.dart处理Zip包:提取指定图片与ArchiveFile转InputStream
一、不解压Zip包提取images子目录的指定图片
直接遍历Archive中的文件,匹配目标图片的完整路径,读取其内存字节数据即可,无需将整个Zip包解压到磁盘:
import 'dart:io'; import 'package:archive/archive.dart'; import 'package:archive_io/archive_io.dart'; void getTargetImageFromZip() { // 打开目标Zip文件 final zipPath = 'your_archive.zip'; final inputStream = InputFileStream(zipPath); final archive = ZipDecoder().decodeBuffer(inputStream); // 定位images目录下的指定图片(示例路径:images/avatar.png) final targetFile = archive.files.firstWhere( (file) => file.name == 'images/avatar.png' && !file.isDirectory, orElse: () => throw StateError('目标图片未在Zip包中找到'), ); // 获取图片字节数据,可直接用于显示、编码等后续操作 final imageBytes = targetFile.content as List<int>; // 示例:转为Flutter可直接使用的MemoryImage // final memoryImage = MemoryImage(imageBytes); inputStream.close(); }
关键说明:
- Zip包内文件的
name属性是完整相对路径(如images/xxx.png),直接匹配即可 - 必须判断
!file.isDirectory,避免误匹配到目录项 - 读取到的
imageBytes是内存中的字节数组,全程无磁盘写入操作
二、将ArchiveFile转换为InputStream
ArchiveFile的content属性本身是List<int>类型,直接通过InputStream.fromBytes()即可完成转换:
import 'package:archive/archive.dart'; void convertArchiveFileToInputStream(ArchiveFile archiveFile) { // 从ArchiveFile内容创建InputStream final inputStream = InputStream.fromBytes(archiveFile.content as List<int>); // 后续可使用InputStream进行解码或其他操作 // 例如解码PNG图片: // final decoder = PngDecoder(); // final image = decoder.decodeBuffer(inputStream); inputStream.close(); }
补充说明:
无论是从Zip包中读取的ArchiveFile,还是你递归压缩时生成的ArchiveFile,只要content已正确填充字节数据,都可以用上述方法转换为InputStream。
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

