Flutter:从存储获取文件后压缩及从文件列表压缩方法
Flutter 使用 archive 包实现文件压缩解决方案
问题1:从存储中获取文件后压缩
假设你已经从存储中拿到目标文件的路径,按以下步骤实现压缩:
- 将存储中的文件路径转为
File对象 - 指定压缩后zip文件的输出路径
- 调用
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
相关产品推荐
相关产品推荐

