使用aiohttp发送文件时报int类型无法序列化错误如何解决
报错原因
aiohttp 的 FormData.add_field() 方法不会自动转换非字符串类型的表单值,而你传入的 payload 中存在 int 类型的数值(比如 include_intonation: 1),aiohttp 无法直接序列化 int 类型作为表单字段值,因此抛出了该异常。requests 库在处理表单数据时会自动完成类型转换,所以之前的代码可以正常运行。
解决方案
在向 FormData 中添加字段时,手动将所有非字符串类型的值转为字符串即可,修改后的参考代码如下:
payload = {'text': input_text, 'question_info': '', 'include_intonation': 1, 'stress_version': stress_version, 'include_fluency': 1, 'include_ielts_subscore': 1} form = aiohttp.FormData() for key, value in payload.items(): # 统一将值转为字符串后再添加 form.add_field(key, str(value)) # 文件对象不需要转字符串,aiohttp可直接处理 form.add_field('user_audio_file', open(saved_file_path, 'rb')) async with aiohttp.ClientSession() as session: async with session.post(url, data=form) as response: response_json = await response.json()
可选优化建议
- 你代码中定义的
files变量未被使用,可以直接删除 - 建议通过上下文管理器打开文件,避免文件句柄泄漏,示例如下:
form = aiohttp.FormData() for key, value in payload.items(): form.add_field(key, str(value)) async with aiohttp.ClientSession() as session: with open(saved_file_path, 'rb') as audio_f: form.add_field('user_audio_file', audio_f) async with session.post(url, data=form) as response: response_json = await response.json()
内容的提问来源于stack exchange,提问作者sajjad alizade
相关产品推荐
相关产品推荐

