服务器接收文件时,有时会使用表单接收的方式,这意味着我们需要使用Python的requests上传表单数据和文件。
常用的方式一般如下:
data = {
‘name‘: ‘nginx‘
}
files = {‘file‘: open("abc.csv", ‘rb‘)}
response = requests.post(url, data=data, files=files)
files是封装好的参数,直接包括了文件内容,文件名,格式等,data则是表单内容,但这样做有一个问题,文件是中文名时,requests就会报错,哪怕encode转码成utf8也没用
百度发现除了requests的这个方法,还可以用一个第三方包MultipartEncoder,而这个包相对来说比较灵活。
一般是from requests_toolbelt.multipart.encoder import MultipartEncoder,这样导入使用
由于公司项目需要兼容各种环境,不主张使用大量第三方库,我精简模块后提取出my_compat 文件,变成 from my_compat import MultipartEncoder这样导入使用
但MultipartEncoder也存在无法转化中文名的问题,所以我在代码里取了巧,先把文件名转化成可解析的字符,然后用to_string方法解析,最后把解析后的字符串转化回去
from requests_toolbelt.multipart.encoder import MultipartEncoder
from my_compat import MultipartEncoder