Python3上传中文文件名的问题

2020-09-02  本文已影响0人  testerzhang

前言

我们之前在Python2.x的时候,用requests上传文件是正常存储中文名字,但是使用Python3之后,文件名就变得不正常了。因为Java服务端接口不支持这种方式,于是只能修改Python脚本。

原因

因为Python3使用requests的时候,会调用urllib3库—>fields.py的新处理逻辑

image.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)
上一篇 下一篇

猜你喜欢

热点阅读