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
相关产品推荐
相关产品推荐

