Flutter如何将Spring Boot返回的字节数组响应转换为JPG文件
问题原因说明
你直接打印response.body出现乱码是因为response.body默认会将响应二进制数据按字符编码转为字符串,而接口返回的是JPG格式的二进制字节流,本身不属于文本内容,自然会出现乱码,你需要直接操作二进制字节流生成文件即可。
实现步骤
- 先添加必要依赖到
pubspec.yaml,path_provider用于获取设备合法存储路径:
dependencies: flutter: sdk: flutter http: ^最新版本号 path_provider: ^最新版本号 path: ^最新版本号 # 可选,用于路径拼接
添加完成后执行flutter pub get同步依赖。
- 修改请求逻辑,直接读取响应二进制字节写入本地文件:
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
相关产品推荐
相关产品推荐

