美文网首页
Python3上传中文文件名的问题

Python3上传中文文件名的问题

作者: testerzhang | 来源:发表于2020-09-02 22:41 被阅读0次

前言

我们之前在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)

相关文章

网友评论

      本文标题:Python3上传中文文件名的问题

      本文链接:https://www.haomeiwen.com/subject/sxaisktx.html