为文件添加边界后POST请求出现UTF-8编码错误的解决咨询
问题分析与解决方案
核心错误原因
- 第一个错误(ValueError):传给
requests.post的files参数格式错误。files需要接收字典类型数据,键为表单字段名,值为包含文件名、文件内容、Content-Type的元组,而非单纯的文件路径字符串。 - 编码错误与连接断开:手动拼接multipart/form-data格式时,将二进制文件转成latin1字符串再编码为UTF-8的操作会破坏原始字节结构,导致服务器无法解析请求,最终触发连接断开。
requests对非UTF-8请求的支持
requests完全支持发送非UTF-8的请求,尤其是文件上传场景。它会自动处理二进制数据的传输,无需手动转码为UTF-8字符串。
修正后的代码
不需要手动拼接边界和编码,直接利用requests的files参数自动处理multipart请求:
# 读取原始二进制文件 with open(fw_file, 'rb') as f: gen_data = f.read() # 构造files参数:键对应表单中的name值,值为(文件名, 二进制数据, 内容类型) files = { 'file': (file_name, gen_data, 'application/octet-stream') } # 发送请求,无需手动设置Content-Type(requests会自动添加带边界的Content-Type) resp = requests.post(target, files=files, headers=headers, verify=False)
为什么之前的方法行不通?
- 手动拼接multipart格式时,将二进制数据通过
latin1解码再转UTF-8的操作会改变原始字节。比如0x94这类非UTF-8字节,转码后会变成不符合原始文件的内容,导致服务器无法识别。 - 手动处理边界、换行符和Content-Type容易出现格式错误,比如边界重复、换行符不正确等,服务器接收到错误格式的请求后会直接断开连接。
内容的提问来源于stack exchange,提问作者Ulysses
相关产品推荐
相关产品推荐

