Python+Requests之文件上传与下载

  • 作者:lwj
  • 分类:Requests
  • 发表日期:2020-07-13 21:34:06
  • 阅读(877)
  • 评论(0)

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

文件上传

一般上传文件使用的都是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": "<censored...binary...data>"
  },
  ...
}

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

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)

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


 

文件下载

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

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方法不安全,如下截图所示:


 

觉得不错,支持一下!

提交评论

您尚未登录,登录之后方可评论~ 登录 or 注册

评论列表

暂无评论
返回顶部

建议反馈

1. 可在博文底部留言评论

2. 发邮件到i_suichuan@163.com