在做接口自动化测试中,经常会遇到文件的上传和下载接口

文件上传

一般上传文件使用的都是Content-Type: multipart/form-data;数据类型,可以发送文件,也可以发送相关的消息体数据。

使用 requests 上传文件的基本步骤:

1.构造文件数据,通过 open 函数以二进制方式打开文件

2.构造相关数据

3.发送请求,将文件数据以 files 参数传入,其他消息体数据通过 data或 json 传入

参考官方文档

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)
>>> r.text
{
...
"files": {
"file": ""
},
...
}

我们对它重新封装一下然后测试下上传

import requests
def test_up(url, file):
"""
:param url: 接口url
:param file: 上传文件的路径
:return:
"""
files = {"file": open(file, "rb")}
s = requests.session()
r = s.post(url, files=files, verify=False)
print(r.json())
if __name__ == "__main__":
url = "https://www.url.com/test/import"
file = "D:\\up.xlsx"
test_up(url=url, file=file)

文件上传成功,结果如下图:

python2上传oss python怎么上传文件_python2上传oss

文件下载

小文件下载,可以直接写入一个文件即可:

import requests

r = requests.get("https://img.sitven.cn/Tencent_blog_detail.jpg")
with open(r"D:\a.jpg", "wb") as f:
f.write(r.content)
下载大文件,建议下面的方式:
import requests
def test_downloads(url, file):
s = requests.session()
r = s.get(url, stream=True, verify=False)
with open(file, "wb") as f:
for chunk in r.iter_content(chunk_size=512):
f.write(chunk)
if __name__ == "__main__":
url = "https://www.url.com/test/export"
file = "D:\\a.xlsx"
test_downloads(url=url, file=file)

运行结果可直接查看文件:D:\\a.xlsx

解释:

当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足。

当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性

时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。

iter_content:一块一块的遍历要下载的内容

iter_lines: 一行一行的遍历要下载的内容

注:官方说明iter_lines方法不安全,如下截图所示:

python2上传oss python怎么上传文件_文件下载_02