Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >aiohttp 异步http请求-4.文件上传multipart/form-data

aiohttp 异步http请求-4.文件上传multipart/form-data

作者头像
上海-悠悠
发布于 2022-04-22 11:13:26
发布于 2022-04-22 11:13:26
3.2K00
代码可运行
举报
运行总次数:0
代码可运行

前言

文件上传接口,post 请求参数类型content-type:multipart/form-data,上传文件分2种情况

  • 小文件上传,可以直接用open函数读取
  • 大文件上传,aiohttp支持多种类型的文件以流媒体的形式上传

官方文档示例

上传 multipart 类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}

await session.post(url, data=files)

也可以明确设置filenamecontent_type

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url = 'http://httpbin.org/post'
data = FormData()
data.add_field('file',
               open('report.xls', 'rb'),
               filename='report.xls',
               content_type='application/vnd.ms-excel')

await session.post(url, data=data)

参考案例

用fiddler抓包,查看抓到的接口,以下这种接口就是multipart/form-data

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Content-Type: multipart/form-data
body参数是这种格式:

——————————————-22165374713946 Content-Disposition: form-data; name=”localUrl”

yoyoketang.png ——————————————-22165374713946 Content-Disposition: form-data; name=”imgFile”; filename=”yoyoketang.png” Content-Type: image/png

上面的接口需要传2个参数

  • title 传字符串
  • file  传一个文件

官网文档写的是只传一个file参数,实际验证也可以传其它字符串参数,如下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession('http://127.0.0.1:8000') as session:
        files = {
            'file': open('a.jpg', 'rb'),
            'title': '文件上传'
            }
        async with session.post('/api/v1/upfile/', data=files) as resp:
            print(resp.url)
            print(await resp.text())

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://http://127.0.0.1:8000/api/v1/upfile/
{"code":0,"msg":"success!","data":{"file":"/media/up_image/a_TEn5GLR.jpg","title":"文件上传","timestamp":"2022-04-21 11:15:28"}}

使用 FormData 类

FormData 类自定义文件类型和名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import aiohttp
import asyncio
from aiohttp import FormData

async def main():
    async with aiohttp.ClientSession('http://49.235.92.12:7005') as session:
        data = FormData()
        data.add_field('file',
                       open('a.jpg', 'rb'),
                       filename='a.jpg',
                       content_type='image/png')
        data.add_field('title', '文件上传1')
        async with session.post('/api/v1/upfile/', data=data) as resp:
            print(resp.url)
            print(await resp.text())

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

大文件上传

小文件上传可以直接open函数读取,大文件直接读取会非常消耗内容。aiohttp支持多种类型的流式上传,这使您可以发送大文件而无需将它们读入内存。 作为一个简单的案例,只需为您的 body 提供一个类似文件的对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with open('massive-body', 'rb') as f:
   await session.post('http://httpbin.org/post', data=f)

或者您可以使用异步生成器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async def file_sender(file_name=None):
    async with aiofiles.open(file_name, 'rb') as f:
        chunk = await f.read(64*1024)
        while chunk:
            yield chunk
            chunk = await f.read(64*1024)

# Then you can use file_sender as a data provider:

async with session.post('http://httpbin.org/post',
                        data=file_sender(file_name='huge_file')) as resp:
    print(await resp.text())

因为该 content 属性是一个 StreamReader(提供异步迭代器协议),所以您可以将 get 和 post 请求链接在一起:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
resp = await session.get('http://python.org')
await session.post('http://httpbin.org/post',
                   data=resp.content)

笔记 Python 3.5 没有对异步生成器的原生支持,使用 async_generator库作为解决方法。 3.1 版后已弃用:aiohttp仍支持aiohttp.streamer装饰器,但不推荐使用此方法,而支持异步生成器,如上所示。

2022年第 1 期《Python 测试平台开发》课程

2022年第 10 期《python接口web自动化+测试开发》课程,2月13号开学

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python解析multipart boundary:aiohttp与requests文件上传详解
在Web开发中,处理文件上传或复杂表单数据时,经常需要使用multipart/form-data格式,而其中的boundary参数则是区分各部分数据的重要分隔符。本文将深入介绍boundary的概念,并针对Python中两个常用的HTTP请求库——aiohttp和requests,分别展示自动与手动构建boundary的方式。最后,通过详细的对比,帮助你理解各自的优缺点,从而选择适合的解决方案。
不止于python
2025/03/17
3980
Python解析multipart boundary:aiohttp与requests文件上传详解
Python网络请求-aiohttp
在 Python 众多的 HTTP 客户端中,最有名的莫过于requests、aiohttp和httpx。
码客说
2021/11/29
1.4K0
python aiohttp_python aiohttp的使用详解
async with aiohttp.request(“GET”,url) as r:
全栈程序员站长
2022/11/17
2K0
python aiohttp_python aiohttp的使用详解
大型fastapi项目实战 高并发请求神器之aiohttp(上) [建议收藏]
在 Python 众多的 HTTP 客户端中,最有名的莫过于 requests、aiohttp 和 httpx。在不借助其他第三方库的情况下,requests 只能发送同步请求;aiohttp 只能发送异步请求;httpx 既能发送同步请求,又能发送异步请求。在并发量大的情况下,如何高效的处理数据,异步是我们的优选,今天我们主要详解的是在生产环境广泛使用的 aiohttp。
python编程从入门到实践
2021/02/04
10.8K1
aiohttp 异步http请求-1.快速入门 get 请求示例
前言 在 python 的众多 http 请求库中,大家最熟悉的就是 requests 库了,requests 库上手非常容易,适合入门学习。 如果平常工作中对发请求不追求效率和并发的情况下,requests 完全可以满足大部分需求。但是想发大量的请求,比如几万个请求的时候,可能需要等待几个小时,requests 库就不能满足需求了。 初学者建议先学习requests 库,熟练掌握requests 库才能更好的学习 aiohttp 异步框架。 同步与异步 requests只能发送同步请求,aiohttp只能
上海-悠悠
2022/04/21
2.6K0
aiohttp 异步http请求-1.快速入门 get 请求示例
aiohttp 异步http请求-9.ClientSession自定义请求头部
前言 ClientSession是所有客户端 API 操作的核心和主要入口点。会话包含 cookie 存储和连接池,因此 cookie 和连接在同一会话发送的 HTTP 请求之间共享。 自定义请求头部 如果您需要将 HTTP 标头添加到请求中,请将它们传递给 headers 参数。如在请求头部添加"Content-Type": "application/json" headers = { "Content-Type": "application/json" } 完整代码: imp
上海-悠悠
2022/04/27
2.5K0
aiohttp 异步http请求-2.post 请求application/json和data
前言 aiohttp 发送post请求,body类型的常见的类型传参: application/json application/x-www-form-urlencode application/json POST 请求接口报文示例,Content-Type类型是application/json POST /api/v1/login/ HTTP/1.1 Accept: application/json, */* Accept-Encoding: gzip, deflate Connection: keep-
上海-悠悠
2022/04/21
6.8K0
aiohttp 异步http请求-5.下载大文件边下载边保存(节省内存)
前言 当从网络上下载小文件时,比如一张图片,可以直接用response.read() 来读取返回的数据流文件。 但是当下载一个几百兆,几千兆的文件会占用很大的内存,为了减少内存的占用可以一边读取一边下载的方式。 流式响应内容 平常返回的response 对象,使用read(), json()和且text()非常方便,但是需谨慎使用它们。所有这些方法都将整个响应加载到内存中。 例如,如果您要下载几个千兆字节大小的文件,这些方法将加载内存中的所有数据。相反,您可以使用该content 属性。它是aiohttp.
上海-悠悠
2022/04/22
3.4K0
aiohttp 异步http请求-5.下载大文件边下载边保存(节省内存)
Python3 新一代Http请求库Httpx使用(详情版)
我们经常使用Python语言的朋友们都清楚,requests 是使用率非常高的 HTTP 库,甚至更早Python2中使用的是 urllib、urllib2 ,也给我们提供了许多方便的功能。
Python兴趣圈
2024/01/12
11.9K0
Python3 新一代Http请求库Httpx使用(详情版)
python3异步爬虫 ——aiohttp模板使用
一.简单使用和讲解 import aiohttp import asyncio async def fetch(client): async with client.get('http://httpbin.org/get') as resp: assert resp.status == 200 return await resp.text() async def main(): async with aiohttp.ClientSession() as
小小咸鱼YwY
2020/10/27
1.4K0
Python网络请求-httpx
在 Python 众多的 HTTP 客户端中,最有名的莫过于requests、aiohttp和httpx。
码客说
2021/11/29
1.2K0
python 基于aiohttp的异步爬虫实战
钢铁知识库,一个学习python爬虫、数据分析的知识库。人生苦短,快用python。
钢铁知识库
2022/09/19
1.1K0
aiohttp 异步http请求-10.ClientSession自定义请求Cookie
前言 要将自己的 cookie 发送到服务器,可以使用构造函数的cookies 参数ClientSession 自定义cookie cookie 定义成字典键值对格式,传参到ClientSession url = 'http://httpbin.org/cookies' cookies = {'cookies_are': 'working'} async with ClientSession(cookies=cookies) as session: async with session.get(ur
上海-悠悠
2022/04/27
2K0
aiohttp 异步http请求-10.ClientSession自定义请求Cookie
python︱用asyncio、aiohttp实现异步及相关案例
Asyncio 是并发(concurrency)的一种方式。对 Python 来说,并发还可以通过线程(threading)和多进程(multiprocessing)来实现。Asyncio 并不能带来真正的并行(parallelism)。当然,因为 GIL(全局解释器锁)的存在,Python 的多线程也不能带来真正的并行。 .
悟乙己
2019/05/26
2.4K0
强大的异步爬虫 with aiohttp
看到现在网络上大多讲的都是requests、scrapy,却没有说到爬虫中的神器:aiohttp
小歪
2018/07/25
1.1K0
httprunner学习25-文件上传multipart/form-data
httprunner上传文件接口,其实跟requests上传文件的接口是一样的,之前在python接口系列里面有案例 python接口自动化16-multipart/form-data上传图片
上海-悠悠
2019/11/15
2.9K0
AIOHTTP的实战(一)
aiohttp是基于asyncio和Python的异步HTTP客户端以及服务器,在这里主要介绍aiohttp在客户端应用请求中的案例应用和案例实战。在使用前需要安装该第三方的库,安装的命令为:
无涯WuYa
2020/07/24
1.4K0
PHP 构造 multipart/form-data 格式 POST 请求体的方法
最近在尝试基于 PHP 做一个反向代理 HTTP 的程序,其中一个需求是将程序收到的HTTP请求还原回 RFC2616 的原始格式。
zgq354
2019/11/24
5.2K0
Python网络请求-requests、JSON转换
在 Python 众多的 HTTP 客户端中,最有名的莫过于requests、aiohttp和httpx。
码客说
2021/11/29
8K0
Python-Requests模块详解
Requests模块是Python中最简单易用的HTTP客户端库,可以极大简化发送HTTP请求的代码
用户9006224
2023/10/11
6690
推荐阅读
相关推荐
Python解析multipart boundary:aiohttp与requests文件上传详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档