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

Flutter如何不使用第三方库从URL下载文件

Flutter 无第三方库实现文件下载方案

Flutter 自带的 Dart SDK 内置了dart:io库,不需要引入任何 pub 第三方依赖就可以完成文件下载逻辑,具体实现如下:

前置准备:添加平台权限

涉及本地文件写入需要先配置对应平台的权限声明:

  • Android 端:在android/app/src/main/AndroidManifest.xml中添加权限,Android 13+ 按需添加图片/视频/音频的访问权限,低版本添加WRITE_EXTERNAL_STORAGE权限
  • iOS 端:在ios/Runner/Info.plist中添加文档目录访问的权限说明

核心下载逻辑实现

首先引入 Dart 内置的依赖库:

import 'dart:io';
import 'dart:typed_data';

完整下载函数示例:

/// 下载文件到本地
/// [downloadUrl] 目标文件的下载链接
/// [savePath] 本地保存的完整路径(需包含文件名和后缀)
/// 下载成功返回本地文件对象,失败抛出对应异常
Future<File> downloadFile(String downloadUrl, String savePath) async {
  final HttpClient httpClient = HttpClient();
  File? localFile;
  try {
    // 发起GET下载请求
    final HttpClientRequest request = await httpClient.getUrl(Uri.parse(downloadUrl));
    final HttpClientResponse response = await request.close();
    
    if (response.statusCode != HttpStatus.ok) {
      throw Exception('下载请求失败,状态码:${response.statusCode}');
    }

    localFile = File(savePath);
    // 小文件直接读取全部字节写入
    final Uint8List fileBytes = await consolidateHttpClientResponseBytes(response);
    await localFile.writeAsBytes(fileBytes);

    return localFile;
  } catch (e) {
    // 下载失败清理已生成的空文件
    if (localFile != null && await localFile.exists()) {
      await localFile.delete();
    }
    rethrow;
  } finally {
    // 释放HttpClient资源
    httpClient.close();
  }
}

大文件下载优化

如果要下载大文件,不要一次性加载全部字节到内存,改用流逐块写入即可避免内存溢出:

// 替换上述代码中字节读取和写入的逻辑即可
final IOSink fileSink = localFile!.openWrite();
await response.pipe(fileSink);
await fileSink.flush();
await fileSink.close();

调用示例

void executeDownload() async {
  const String targetUrl = "你的文件下载链接";
  // 示例保存路径:系统临时目录下的test.zip
  final String savePath = "${Directory.systemTemp.path}/test.zip";
  try {
    File resultFile = await downloadFile(targetUrl, savePath);
    print("下载完成,本地文件路径:${resultFile.path}");
    // 后续直接使用resultFile处理文件资源即可
  } catch (err) {
    print("下载出错:$err");
  }
}

注意事项

  • 下载逻辑需要在异步函数中执行,避免阻塞UI线程
  • 如果需要保存到应用私有目录,不需要申请外部存储权限,直接拼接对应平台的私有目录路径即可使用
  • Android 10及以上版本保存到公共下载目录需要搭配MediaStore API实现,无需申请存储权限

内容的提问来源于stack exchange,提问作者Saiful Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:18:01