Flutter如何从Blob类型API响应下载文件至设备?求推荐相关库
在Flutter中处理Blob类型API响应并下载文件
核心实现步骤
Blob本质是二进制数据流,处理逻辑就是获取二进制数据→写入本地文件,以下是基础实现方式:
1. 获取API返回的二进制数据
使用网络库发起请求时,直接获取响应的字节数据,避免自动解析为JSON或文本。
2. 写入本地文件
借助路径管理库获取设备可写入目录,再通过dart:io的File类完成字节写入。
基础示例(使用http库)
import 'dart:io'; import 'package:http/http.dart' as http; import 'package:path_provider/path_provider.dart'; Future<void> downloadBlob(String apiUrl, String saveFileName) async { // 发起请求获取二进制数据 final response = await http.get(Uri.parse(apiUrl)); if (response.statusCode == 200) { // 获取应用文档目录(适配iOS/Android) final storageDir = await getApplicationDocumentsDirectory(); final targetFile = File('${storageDir.path}/$saveFileName'); // 将字节写入文件 await targetFile.writeAsBytes(response.bodyBytes); print('文件已保存至:${targetFile.path}'); } else { throw Exception('请求失败,状态码:${response.statusCode}'); } }
推荐适用的Flutter库
根据不同场景选择合适的库:
- http:官方轻量网络库,满足基础Blob下载需求,无需额外配置,适合简单场景。
- dio:功能全面的网络库,支持进度监听、断点续传,能直接指定响应类型为字节,复杂下载场景首选。
Dio实现示例
import 'dart:io'; import 'package:dio/dio.dart'; import 'package:path_provider/path_provider.dart'; Future<void> downloadBlobWithDio(String apiUrl, String saveFileName) async { final dio = Dio(); final storageDir = await getApplicationDocumentsDirectory(); final savePath = '${storageDir.path}/$saveFileName'; try { await dio.download( apiUrl, savePath, options: Options(responseType: ResponseType.bytes), // 强制返回字节数据 onReceiveProgress: (received, total) { if (total != -1) { print('下载进度:${(received / total * 100).toStringAsFixed(1)}%'); } }, ); print('文件保存完成:$savePath'); } catch (e) { print('下载出错:$e'); } } - flutter_downloader:专业下载库,支持后台下载、系统通知栏进度显示,适合大文件或需要后台执行的下载任务,配置稍复杂但功能强大。
注意事项
- 权限配置:
- Android:在
AndroidManifest.xml中添加存储权限(如WRITE_EXTERNAL_STORAGE,针对Android 10及以下;Android 11+需MANAGE_EXTERNAL_STORAGE)。 - iOS:在
Info.plist中添加NSDocumentDirectoryUsageDescription,说明访问文档目录的用途。
- Android:在
- 请求头适配:部分API需要指定请求头(如
Accept: application/octet-stream),确保服务器返回正确的二进制Blob数据。
内容的提问来源于stack exchange,提问作者deok
相关产品推荐
相关产品推荐

