Flutter中如何从本地包assets文件夹获取并复制大文件?
问题解决:从Flutter本地包Assets复制大文件到临时目录
问题核心
直接用File类访问assets路径行不通——Flutter的assets是打包在应用资源包里的,并非设备文件系统中的真实文件,所以File.existsSync()必然返回"File not found"。而rootBundle.load()加载大文件时会触发内存溢出,抛出"too large"错误。
正确解决方案
用rootBundle.openByteStream()以流式方式读取assets文件,避免一次性加载大文件到内存,再逐步写入目标文件。同时务必确认pubspec.yaml的assets配置正确。
步骤1:校验pubspec.yaml配置
确保assets路径已正确声明,注意包名前缀和路径格式:
flutter: assets: - packages/local_wifi_manager_old/assets/ota/salus/firmware/SAU2AG1_ZC.tar.gz
步骤2:流式复制的代码实现
import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; Future<void> copyAssetToTemp() async { final String cachePath = (await getTemporaryDirectory()).path; const String assetPath = "packages/local_wifi_manager_old/assets/ota/salus/firmware/SAU2AG1_ZC.tar.gz"; final File destinationFile = File("$cachePath/SAU2AG1_ZC.tar.gz"); try { // 打开assets的字节流(流式读取,不占内存) final ByteStream stream = rootBundle.openByteStream(assetPath); // 创建目标文件的写入流 final IOSink sink = destinationFile.openWrite(); // 管道流式复制,完成后关闭流 await stream.pipe(sink); await sink.close(); print("文件复制成功"); } catch (e) { print("复制失败: $e"); } }
关键说明
rootBundle.openByteStream()返回字节流,专门用于处理大文件,不会一次性加载全部内容到内存。- 代码中的assets路径必须和
pubspec.yaml里的配置完全一致,跨包assets必须带packages/[包名]前缀。 - 永远不要用
File类直接访问assets路径,assets不是文件系统中的真实文件。
内容的提问来源于stack exchange,提问作者Ravi Patel
相关产品推荐
相关产品推荐

