python接口自动化14-multipart/form-data上传图片

前言
在提交表单操作的时候,经常会遇到图片上传的操作,图片上传是一个单独的接口,本篇以禅道为例,介绍如何上传图片

一、上传接口

1.以禅道上提交bug为例,在选择图片时,点确定按钮,就是上传图片了

2.用fiddler抓包,查看抓到的接口,以下这种接口就是multipart/form-data
- 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

二、先登录

1.因为上传图片是在登录之后操作的,这个需要依赖用户登录
```
# coding:utf-8
import requests

base = 'http://127.0.0.1:81/'  # 禅道的服务器地址

loginUrl = base+"/zentao/user-login.html"

h = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding": "gzip, deflate",
    "Referer": "http://127.0.0.1/zentao/user-login.html",
    # "Cookie":  # 头部没登录前不用传cookie,因为这里cookie就是保持登录的
    "Connection": "keep-alive",
    "Content-Type": "application/x-www-form-urlencoded",
    }

body = {"account":"admin",
        "password":"e10adc3949ba59abbe56e057f20f883e",
        "keepLogin[]":"on",
        "referer":"http://127.0.0.1/zentao/my/"
        }

s = requests.session()  # 保持会话
r = s.post(loginUrl, data=body, headers=h)
print r.content  # 打印结果看到location='http://127.0.0.1/zentao/my/'说明登录成功了
```

三、上传图片

1.上传图片以下这种格式:
-----------------------------22165374713946
Content-Disposition: form-data; name="localUrl"

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

2.写成字典格式,key对应name="imgFile"这里name对应的值

3.value里面是一个元组()
- 第一个参数是filename=后面对应的值,没有就写None
- 第二个是上面的这个值“”yoyoketang.png“”,或者是文件open打开的二进制流
- 第三个是Content-Type对应的类型,如:"image/png"

f ={
    "localUrl": (None,"1.png"),
    "imgFile": ("1.png", open("d:\\1.png", "rb"), "image/png")
  }

四、验证是否上传成功
1.获取上传后的地址,放到浏览器的地址栏请求下,看是不是刚才上传的图片

五、参考代码
```
# coding:utf-8
import requests

base = 'http://127.0.0.1:81/'  # 禅道的服务器地址

loginUrl = base+"/zentao/user-login.html"

h = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
    "Accept-Encoding": "gzip, deflate",
    "Referer": "http://127.0.0.1/zentao/user-login.html",
    # "Cookie":  # 头部没登录前不用传cookie,因为这里cookie就是保持登录的
    "Connection": "keep-alive",
    "Content-Type": "application/x-www-form-urlencoded",
    }

body = {"account":"admin",
        "password":"e10adc3949ba59abbe56e057f20f883e",
        "keepLogin[]":"on",
        "referer":"http://127.0.0.1/zentao/my/"
        }

s = requests.session()  # 保持会话
r = s.post(loginUrl, data=body, headers=h)
print r.content  # 打印结果看到location='http://127.0.0.1/zentao/my/'说明登录成功了

# 上传图片
url1 = "http://127.0.0.1:81/zentao/file-ajaxUpload-5a26aca290b59.html?dir=image"

f ={
    "localUrl": (None,"1.png"),
    "imgFile": ("1.png", open("d:\\1.png", "rb"), "image/png")
  }
r = s.post(url1, files=f)
try:
    jpgurl = base+r.json()["url"]
    print(u"上传图片后的url地址:%s"%jpgurl)
except Exception as msg:
    print(u"返回值不是json格式:%s"%str(msg))
    print(r.content)
```

(0)

相关推荐

  • SpringBoot 接口同时接收MultipartFile参数和结构体参数

    前言: 近期接手一个需求,需求转成代码实现就是需要在一个接口实现很多参数传递的同时加上文件上传,考虑到参数比较多,参数封装成body上传,文件用单独的 MultipartFile 接收:前端死活对接不 ...

  • SpringBoot 多文件上传、携带参数

    参考文章: https://stackoverflow.com/questions/36005436/the-request-was-rejected-because-no-multipart-bou ...

  • python接口自动化11-post传data参数案例

    前言: 前面登录博客园的是传json参数,有些登录不是传json的,如jenkins的登录,本篇以jenkins登录为案例,传data参数. 一.登录jenkins抓包 1.登录jenkins,输入账 ...

  • python接口自动化18-requests-toolbelt处理multipart/form-data

    一.requests-toolbelt 1.官方文档地址:[requests-toolbelt官方文档](https://pypi.python.org/pypi/requests-toolbelt/ ...

  • python接口自动化1-发送get请求

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来后面的自动化都离不开它. 一.环境安装 1.用pip安装requests模块 >>p ...

  • python接口自动化2-发送post请求

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  • python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>im ...

  • python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  • python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  • python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  • python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 一.删除草稿箱 1.我们前面讲过登录后保存草稿箱, ...