前言
我们之前在Python2.x的时候,用requests上传文件是正常存储中文名字,但是使用Python3之后,文件名就变得不正常了。因为Java服务端接口不支持这种方式,于是只能修改Python脚本。
原因
因为Python3使用requests的时候,会调用urllib3库—>fields.py的新处理逻辑
![](https://img.haomeiwen.com/i686941/80e3e8cbe0aa09c7.png)
当文件名是中文的时候,value = email.utils.encode_rfc2231(value, 'utf-8')
就会转换格式为:
filename*
这种格式的键值对。
解决方案
当然改源码文件是最快的,但是这样不利于移植。
还是修改下requests请求吧。
def rewrite_request(prepared_request):
file_name_lists = re.findall(b"filename\*=(.+?)\r\n", prepared_request.body)
for i, filename in enumerate(file_name_lists):
# bytes to string
ys_filename = filename.decode()
# discard char
dis_filename = ys_filename.replace("utf-8''", '')
# 转成中文
zw_filename = unquote(dis_filename)
# 中文 to bytes
filename = zw_filename.encode('utf-8')
ys_content = b"filename\*=utf-8\\'\\'" + dis_filename.encode('utf-8')
new_content = b'filename=' + filename + b"\r\n\r\n"
prepared_request.body = re.sub(ys_content, new_content, prepared_request.body)
return prepared_request
#发送请求给服务端
self.response = requests.post(url, files=newfiles, auth=rewrite_request)
网友评论