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

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,说明访问文档目录的用途。
  • 请求头适配:部分API需要指定请求头(如Accept: application/octet-stream),确保服务器返回正确的二进制Blob数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:05:25