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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:29:53