
本文介绍如何用 Jmeter 模拟浏览器表单上传文件。首先介绍上传的原理,随后介绍两种方法。
目录
表单提交数据
从浏览器端向服务器端提交数据,比如用户名、密码、上传文件等,是通过表单来完成的。比如下面的 HTML:
<form action="/some/upload/path" method="post">
用户名? <input type="text" name="user-name"><br>
密码? <input type="password" name="user-name"><br>
上传文件? <input type="file" name="files"><br>
<input type="submit" value="Send"> <input type="reset">
</form>
在浏览器的页面中将展示出如下的控件:
用户填写内容,点击 Send 按钮后,填写的信息将作为表单信息整体以 POST 方法提交到 /some/upload/path
路径中。 POST 请求的内容(也就是 body)则由浏览器自动编码生成,编码方式有如下两种:
编码方式
表单中的数据将以特殊的方式编码后,通过 http 协议上传。有两种编码方式:
- application/x-www-form-urlencoded
- multipart/form-data
application/x-www-form-urlencoded 方法仅能传送少量的数据,比如用户名、密码之类。当上传文件时,尤其是二进制文件(图片、声音、压缩包)时,只能使用第二种:multipart/form-data 编码方法。这种方法有如下优点:
- 一次请求的请求体可以包含多个部分
- 每部分的内容是各自独立的,所有信息都包含在内部
- 请求体各部分之间以分隔边界(Boundary)相隔
- Boundary 规定在请求头的 Content-Type 里
- Boundary 可以是任意字符串,为了避免和真实数据混淆,内容应该足够长、足够随机
- 两端的 Boundary 需要再加两个横杠字符,以示开始和终结