You need to enable JavaScript to run this app. Flutter iOS端无法将下载文件保存至documents目录问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Flutter iOS端无法将下载文件保存至documents目录问题求助

问题原因

你的代码在iOS运行失败核心是两个平台的文件系统规则差异:

  • Android对手动拼接的路径容错率更高,即使格式存在小问题也能正常识别
  • iOS沙盒路径校验严格,你手动用/拼接路径的方式存在兼容问题,同时从报错日志可见,实际存储路径被误定位到了Library/Caches目录而非你预期的Documents目录,路径不匹配导致系统找不到目标文件。

修复步骤

  1. 先添加官方路径处理依赖path到pubspec.yaml,避免手动拼接路径的分隔符兼容问题:
dependencies:
  path: ^1.8.3
  1. 替换原有路径生成逻辑,使用path包的join方法自动适配平台路径规则:
// 顶部导入path包
import 'package:path/path.dart' as path;

// 路径生成部分修改为以下代码
var dir = await getApplicationDocumentsDirectory();
// 提前校验目录存在性,兼容异常情况
if (!await dir.exists()) {
  await dir.create(recursive: true);
}
const documentName = "testname.pdf";
final storePath = path.join(dir.path, documentName);
  1. 优化dio下载配置,避免全局配置覆盖存储路径:
try {
  await dio.download(
    url, 
    storePath, 
    // 单独指定下载配置,避免全局配置干扰
    options: Options(
      responseType: ResponseType.bytes,
      followRedirects: true,
      receiveTimeout: const Duration(minutes: 2),
    ),
    onReceiveProgress: (rec, total) {
      // 增加total合法性校验,避免总大小为0时出现除以0异常
      if (total <= 0) return;
      print("Rec: $rec , Total: $total");
      _setState(() {
        downloading = true;
        progressString = "${((rec / total) * 100).toStringAsFixed(0)}%";
      });
    },
  );
} catch (e) {
  print(e);
}
  1. 如果你使用的下载链接是HTTP协议,需要在iOS项目的ios/Runner/Info.plist中添加网络权限配置,iOS默认禁止HTTP请求:
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

以上修改完成后重新运行即可正常在iOS平台下载文件到Documents目录。

内容的提问来源于stack exchange,提问作者Viktor Vostrikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 11:15:04