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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:35:31