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

Flutter如何将Spring Boot返回的字节数组响应转换为JPG文件

问题原因说明

你直接打印response.body出现乱码是因为response.body默认会将响应二进制数据按字符编码转为字符串,而接口返回的是JPG格式的二进制字节流,本身不属于文本内容,自然会出现乱码,你需要直接操作二进制字节流生成文件即可。


实现步骤

  1. 先添加必要依赖到pubspec.yaml,path_provider用于获取设备合法存储路径:
dependencies:
  flutter:
    sdk: flutter
  http: ^最新版本号
  path_provider: ^最新版本号
  path: ^最新版本号 # 可选,用于路径拼接

添加完成后执行flutter pub get同步依赖。

  1. 修改请求逻辑,直接读取响应二进制字节写入本地文件:
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;

Future<File?> getFileById(int id, String token) async {
  try {
    var response = await http.get(Uri.parse("$URL$id"), headers: {
      HttpHeaders.authorizationHeader: 'bearer $token',
    });
    // 先校验请求是否成功
    if (response.statusCode != HttpStatus.ok) {
      return null;
    }
    // 获取应用私有文档目录,不需要额外申请存储权限
    Directory appDocDir = await getApplicationDocumentsDirectory();
    // 自定义存储文件路径,这里用请求id作为文件名
    File targetFile = File(path.join(appDocDir.path, "$id.jpg"));
    // 直接将响应二进制字节写入文件,不要用response.body
    await targetFile.writeAsBytes(response.bodyBytes);
    return targetFile;
  } catch (e) {
    print("文件保存失败: $e");
    return null;
  }
}

可选优化

你可以在Spring Boot接口的响应头中添加Content-Type: image/jpeg和Content-Disposition参数指定文件名,Flutter端可以直接从响应头读取文件名使用,不需要自定义生成。
如果需要把文件同步到系统相册,需要额外申请对应平台的存储权限,配合gallery_saver等第三方库实现即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 20:39:01