Flutter中如何将Node.js返回的Base64字符串转为MP3音频文件
解决方案:Flutter中获取二进制MP3并保存为文件
你的问题核心是Flutter请求和响应处理的方式错误,导致二进制音频数据被当成文本/Base64处理,进而引发格式异常。以下是具体修正步骤:
1. 修正HTTP请求的响应类型
Flutter的http包不通过headers设置响应类型,而是需要显式指定responseType参数为ResponseType.bytes,这样才能正确获取二进制数据:
final res = await http.post( Uri.parse('你的接口地址'), responseType: ResponseType.bytes, // 关键:指定获取二进制字节 body: {'type': 'TTS', 'text': 'Hello from flutter.'}, );
2. 正确处理响应数据
后端返回的是原始MP3二进制字节,不是Base64编码字符串,所以不需要调用base64.decode,也不能用utf8.decode(MP3不是文本格式)。直接使用res.bodyBytes(Uint8List类型)即可:
if (res.statusCode == 200) { // res.bodyBytes 就是MP3的原始二进制数据 Uint8List mp3Bytes = res.bodyBytes; // 接下来将字节写入文件保存为MP3 saveMp3File(mp3Bytes); }
3. 实现保存MP3到本地的方法
需要借助path_provider包获取合法的存储路径,然后写入文件:
首先在pubspec.yaml添加依赖:
dependencies: path_provider: ^2.1.1
然后实现保存函数:
import 'dart:io'; import 'package:path_provider/path_provider.dart'; Future<void> saveMp3File(Uint8List bytes) async { // 获取应用文档目录 Directory appDir = await getApplicationDocumentsDirectory(); String filePath = '${appDir.path}/output.mp3'; // 将字节写入文件 File file = File(filePath); await file.writeAsBytes(bytes); print('MP3文件已保存到:$filePath'); }
错误原因分析
- 你之前在headers中设置
responseType: "arraybuffer"是无效的,Flutter的http包不识别这个header,必须通过responseType参数指定。 - 调用
base64.decode(res.body)完全错误:res.body在默认情况下是把二进制数据转成了UTF8字符串(导致乱码),而原始响应根本不是Base64编码的内容。 utf8.decode(decoded)更是错误操作,MP3是二进制音频格式,不是UTF8文本,强行解码必然抛出格式异常。
对比你的Node.js代码,axios的responseType: "arraybuffer"直接获取到Buffer,然后写入文件;Flutter中对应的就是ResponseType.bytes获取Uint8List,再写入文件,逻辑完全一致。
内容的提问来源于stack exchange,提问作者SnehE
相关产品推荐
相关产品推荐

