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

Flutter:从存储获取文件后压缩及从文件列表压缩方法

Flutter 使用 archive 包实现文件压缩解决方案

问题1:从存储中获取文件后压缩

假设你已经从存储中拿到目标文件的路径,按以下步骤实现压缩:

  1. 将存储中的文件路径转为File对象
  2. 指定压缩后zip文件的输出路径
  3. 调用ZipFile.createFromFiles完成压缩,注意sourceDir需传入文件所在的父目录,确保zip内保留正确的相对路径结构

示例代码:

// 从存储获取到的目标文件路径
String storageFilePath = "/storage/emulated/0/Documents/my_file.pdf";
File targetFile = File(storageFilePath);

// 压缩后zip文件的输出路径
File zipOutput = File("/storage/emulated/0/Documents/compressed.zip");

// 文件所在的父目录
Directory sourceDir = targetFile.parent;

try {
  await ZipFile.createFromFiles(
    sourceDir: sourceDir,
    files: [targetFile],
    zipFile: zipOutput,
  );
  print("压缩成功");
} catch (e) {
  print("压缩失败: $e");
}

问题2:从指定文件列表压缩

你的文件列表路径为files[index].path,只需将这些路径转为File对象集合,再执行压缩即可:

示例代码:

// 你的原始文件列表(假设包含path字段)
List<dynamic> yourFileList = [...]; 
// 将路径转为File对象集合
List<File> filesToZip = yourFileList.map((item) => File(item.path)).toList();

// 确定sourceDir:若所有文件在同一目录,取第一个文件的父目录;若目录不同,传共同父目录或根目录
Directory sourceDir = filesToZip.isNotEmpty ? filesToZip.first.parent : Directory("/");

// 压缩输出路径
File zipOutput = File("/storage/emulated/0/Documents/batch_compressed.zip");

try {
  await ZipFile.createFromFiles(
    sourceDir: sourceDir,
    files: filesToZip,
    zipFile: zipOutput,
  );
  print("批量压缩成功");
} catch (e) {
  print("批量压缩失败: $e");
}

注意事项

  • 确保App已获取存储读写权限(Android需申请READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE,iOS需配置NSDocumentDirectory相关权限)
  • 如果文件列表中的文件来自不同目录,sourceDir设为共同父目录可保留zip内的文件层级;若不需要层级,可单独处理每个文件后添加到zip
  • 建议使用await异步执行压缩,避免阻塞UI线程

内容的提问来源于stack exchange,提问作者Faizan Abbas Bangash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:46:39