专栏首页从零开始学自动化测试python接口自动化14-multipart/form-data上传图片

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)
```

本文分享自微信公众号 - 从零开始学自动化测试(yoyoketang),作者:YOYO

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • httprunner学习25-文件上传multipart/form-data

    httprunner上传文件接口,其实跟requests上传文件的接口是一样的,之前在python接口系列里面有案例 python接口自动化16-multipa...

    上海-悠悠
  • Fiddler抓包5-接口测试(Composer)

    前言 Fiddler最大的优势在于抓包,我们大部分使用的功能也在抓包的功能上,当然fiddler做接口测试也是非常方便的。 对于没有接口测试文档的时候,可以直...

    上海-悠悠
  • 关于面试总结10-selenium中隐藏元素定位

    面试题:selenium中隐藏元素如何定位?这个是很多面试官喜欢问的一个题,如果单纯的定位的话,隐藏元素和普通不隐藏元素定位没啥区别,用正常定位方法就行了 但是...

    上海-悠悠
  • Web 推送技术

    伴随着今年 Google I/O 大会的召开,一个很火的概念--Progressive Web Apps 诞生了。这代表着我们 web 端有了和原生 APP 媲...

    腾讯IVWEB团队
  • 7.python常用模块

    time模块 常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time) UTC(Coordinated Universal Time,世界...

    zhang_derek
  • 一个简洁、有趣的无限下拉方案

    长列表渲染、无限下拉也算是前端开发老生常谈的问题之一了,本文将介绍一种简洁、巧妙、高效的方式来实现。话不多说,看下图,也许你可以发现什么

    Nealyang
  • 100天搞定机器学习|推荐一个课程和三本教材(附下载)

    Bloomberg是全球最大的金融信息服务供应商,其内部有一个“机器学习EDU”计划,核心课程《Foundations of Machine Learning》...

    统计学家
  • 教你如何配置一套强大的防火墙——iptabels配置详解(一)

    今天我来带领大家给自己的服务器搭建一套强大的防火墙!废话不多说,我们开始吧~ 啥是iptables? ipbtales是集成再Linux内核中的一套防火墙软件。...

    大闲人柴毛毛
  • 知识点

    bin2hex 二进位转成十六进位。 语法: string bin2hex(string str); 返回值: 字符串 函数种类: 资料处理 本函数让二进位字符...

    wangxl
  • SpringBoot核心【starter启动器】

      SpringBoot为我们提供了简化企业级开发绝大多数场景的starter pom,只要使用了应用场景所需要的start pom,相关的技术配置将会消除,就...

    用户4919348

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动