shan

requests post中文名文件

2019-03-05

这两天使用requests库向一些测试接口post文件的时候,服务器报错,查了半天,发现好像是中文字符导致的问题,遂寻找以下解决办法。

1、使用urllib总的quote和unquote方法

发现可以使用urllib库中quote方法将文件名中的特殊字符转为安全字符,然后可以在服务端将文件名再用unquote转回来,代码如下:

1.1 上传测试使用requests库的代码

1
2
3
4
5
6
7
8

import requests
import urllib

url = "127.0.0.1:8080/upload"
file_name = "c:\\test\\测试用文档.doc"
file = {"file": (urllib.quote(file_name), open(file_name, "rb"))}
requests.post(url, files=file)

1.2 服务端代码

1
2
3
4
5
6
7
8
9
10
11
# ... 省略的其他导入模块
import urllib


@app.route("/upload",["POST"])
def upload():
file = request.files['file']
filename = file.filename
# 将文件名转回正常名称
file_name = urllib.unquote(filename.encode("utf-8"))
# ... 其他实现代码

2、将file_name 当做参数放入data

把file_name 当做参数放在data中,之后再到服务端将file_name 取出

2.1 测试使用requests库的代码

1
2
3
4
5
6
7
import requests
import urllib

url = "127.0.0.1:8080/upload"
file_name = "c:\\test\\测试用文档.doc"
file = {"file": open(file_name, "rb")}
requests.post(url, data={"file_name": file_name}, files=file)

2.2 服务端代码

1
2
3
4
5
6
7
8
9
# ... 省略的其他导入模块
import urllib


@app.route("/upload",["POST"])
def upload():
file = request.files['file']
file_name = request.form.get("file_name")
# ... 其他实现代码

3、修改urllib或flask源码,修改验证方式

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章