You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:43:21