天天看点

解决Python3 requests库 post方法 上传附件,name和filename中文乱码问题

一.问题描述

在使用post方法请求接口时,请求的内容中包含附件(这里是图片),

解决Python3 requests库 post方法 上传附件,name和filename中文乱码问题

服务器需要用到图片的名称字段,来解析得到图片的分类信息(例如,这张图片属于子单照片),

但是发送请求后,服务器报错“必填参数为空”,抓包分析发现上传附件的文件名不正确,导致服务器无法正确解析文件名。

解决Python3 requests库 post方法 上传附件,name和filename中文乱码问题

二.相关代码

#coding=UTF-8
import requests


Base_URL = 'http://XX.XX.XX.XX'


def build_uri(endpoint):
    return '/'.join([Base_URL, endpoint])


def post_method(url,data,files):
    response = requests.post(url=url,data=data,files=files)
    print(response.text)



if __name__ == '__main__':

    file_name1 = 'value_1.txt'

    with open(file_name1) as f1:
        con = f1.read()
        print(type(con))
        print(con)

    data = {"req": con}

    headers = {"content-type": "multipart/form-data"}

    files = {'864_子单照片_0': ("001_附件.jpg", open("001_附件.jpg", "rb"), "image/jpg", {})}

    url = build_uri('mobile/postQCProblemCargo')

    post_method(url, data, files)
           

三.解决方法

在网上尝试了很多方法,大致就是post在发送数据时编码和解码问题

实测有效的方法:

修改requests库所引用的urllib3库的源文件fields.py

解决Python3 requests库 post方法 上传附件,name和filename中文乱码问题

1.注释掉图中标记的一行(45行)

解决Python3 requests库 post方法 上传附件,name和filename中文乱码问题

2.把图中标记的一行(46行)修改为:

value = '%s="%s"' % (name, value)
           
解决Python3 requests库 post方法 上传附件,name和filename中文乱码问题

四.修改后请求抓包结果

解决Python3 requests库 post方法 上传附件,name和filename中文乱码问题

可以看到,问题成功解决。