C#将wav转base64 POST至Flask API 解码报utf-8 0x80无效起始字节错误求助
报错定位与修复方案
核心触发原因
报错'utf-8' codec can't decode byte 0x80 in position 28: invalid start byte完全来自Flask端的冗余逻辑,和C#上传链路无关。
- C#端从读取wav、转base64、打包JSON用UTF-8编码POST的全流程是合规的,Flask通过
request.json拿到的File字段已经是正常的base64字符串,传输层没有问题。 - 错误触发点:base64解码完成后,代码多执行了一行
_file = file_decoded.decode()。base64解码得到的是wav原始二进制字节流,本身不是文本,不满足UTF-8的编码规则,强行转字符串必然遇到无法识别的字节(比如报错中的0x80)抛出异常。 - 这行代码属于无意义冗余:后续保存文件用的是
wb模式直接写入file_decoded,根本没用到定义的_file变量。
修正后的Flask接口代码
删掉多余的二进制转字符串逻辑即可,修正后的代码还补充了自动创建保存目录的兜底逻辑,避免因目录不存在报错:
@app.route('/api/Call/putWavFile', methods=['POST']) def PutWavFile(): if not request.json or not 'token' in request.json: abort(400) try: filename = request.json['FileName'] base64_str = request.json['File'] # base64字符串转原始wav二进制 file_decoded = base64.decodebytes(base64_str.encode('utf-8').strip()) path_to_save = os.path.join(os.getcwd(), 'Watch', filename) # 自动创建保存目录 os.makedirs(os.path.dirname(path_to_save), exist_ok=True) with open(path_to_save, mode='wb') as f: f.write(file_decoded) return jsonify({"FileCreated": "Success"}) except Exception as exc: print(f"FileError: {str(exc)}") return jsonify( {"Error": f"{str(exc)}"} )
注意事项
- 现有C#端逻辑不需要任何调整,小体积wav文件的传输场景下,base64+JSON的方案完全可用。
- 建议对接收的
filename做路径穿越校验,避免恶意构造的文件名覆盖服务器其他位置的文件。
内容的提问来源于stack exchange,提问作者Mxolisi
相关产品推荐
相关产品推荐

