JMeter 源码解析之一:JMeter 上传文件时,如何参数化 Content-Disposition 的 filename?

本文详细探讨了在JMeter进行文件上传时如何参数化Content-Disposition的filename,通过添加HTTP参数、设置HTTP信息头管理器以及利用BeanShell的方法,针对Java、HttpClient4和HttpClient3.1三种不同的HTTP请求Implementation提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        问题描述

        文件上传时,用户定义 Content-Disposition 是失效的。
        笔者在写压力测试脚本的时候,有个上传页面,服务器是根据用户传过来的 Content-Disposition 里的 filename 值来定义保存文件的文件名的。但是测试人员不可能为每一次请求都准备一个不同的文件(这个工作量海了去了),所以 JMeter 传给服务器的 Content-Disposition 里的 filename 必须是随机而不重复的。
        有人问,用户真实上传时,浏览器传给服务器的 filename 也是上传文件名吗?不是的,js 这样修改的 filename:
            uploader.onBeforeUploadItem = function (item) {
                //修改名字
                var timeStamp = new Date().getTime();
                var fileName = item.file.name;
                item.file.name = timeStamp + fileName.substr(fileName.lastIndexOf('.'));
                var day = $filter('date')(new Date(), 'yyyyMMdd');
                item.url = [item.url, "batchImport", item.importType, day, session.userId].join("/");
            };

        笔者尝试了多种办法,试图修改服务器接收到的 filename 值,结果都失败了。笔者尝试的办法有:

        1. 添加 HTTP 参数

添加 HTTP 参数
        如图所示,我们期待服务器接收到的 filename 值是 00004000.xls,而不是 00000000.xls。
        结果服务器接收到的是 00000000.xls。服务器返回给客户端的存储路径为证:/batchImport/merAdd/20141128/1/00000000.xls。查看本次 HTTP 请求,可以看到以下信息:
POST http://serverIP/upload/batchImport/merAdd/20141128/1

POST data:
--DoZtX5jrOIxJTocysPzYJ1WVqtoagXMQHHqho4i
Content-Disposition: form-data; name="Content-Disposition"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit

form-data; name="14170058206940.xls"; filename="00004000.xls"
--DoZtX5jrOIxJTocysPzYJ1WVqtoagXMQHHqho4i
Content-Disposition: form-data; name="file"; filename="00000000.xls"
Content-Type: application/vnd.ms-excel
Content-Transfer-Encoding: binary

<actual file content, not shown here>
--DoZtX5jrOIxJTocysPzYJ1WVqtoagXMQHHqho4i--

Cookie Data:
$Version=0; JSESSIONID=AC79777AEFE5AFC690623FCCB09E5DD5; $Path=/

Request Headers:
Connection: keep-alive
Content-Length: 34786
Content-Type: multipart/form-data; boundary=DoZtX5jrOIxJTocysPzYJ1WVqtoagXMQHHqho4i
Host: serverIP
User-Agent: Apache-HttpClient/4.2.6 (java 1.5)

        看来 JMeter 把我们的 Content-Disposition 参数名字都丢了。

        2. 添加 HTTP 信息头管理器

添加 HTTP 信息头管理器
        如图所示,我们期待服务器接收到的 filename 值是 40004000.xls,而不是 00000000.xls。
        然后我们发次请求,然后查看本次 HTTP 请求,可以看到以下信息:
POST http://serverIP/upload/batchImport/merAdd/20141128/1

POST data:
--BNKvCNweqwpTJToYINcDn6JJfzjazBE550a-
Content-Disposition: form-data; name="file"; filename="00000000.xls"
Content-Type: application/vnd.ms-excel
Content-Transfer-Encoding: binary

<actual file content, not shown here>
--BNKvCNweqwpTJToYINcDn6JJfzjazBE550a---

Cookie Data:
$Version=0; JSESSIONID=49AB53310FB7241B5544B4E747A58F80; $Path=/

Request Headers:
Connection: keep-alive
Content-Disposition: form-data; name="file"; filename="40004000.xls"
Content-Length: 34535
Content-Type: multipart/form-data; boundary=BNKvCNweqwpTJToYINcDn6JJfzjazBE550a-
Host: serverIP
User-Agent: Apache-HttpClient/4.2.6 (java 1.5)
### 如何在JMeter中实现文件上传功能 要在JMeter中实现文件上传功能,可以按照以下方法进行配置。以下是详细的说明以及示例。 #### 配置步骤 为了模拟文件上传操作,在JMeter中的HTTP请求采样器需要设置特定的参数[^2]: 1. **创建线程组** 打开JMeter并创建一个新的测试计划,然后添加一个线程组作为基础容器。 2. **添加HTTP请求采样器** 在线程组下添加一个`HTTP Request`采样器,这是用来发送实际请求的部分。 3. **填写服务器地址和端口** 设置目标服务器的IP地址或域名及其对应的端口号。 4. **指定请求路径** 输入API的具体URL路径,该路径应指向支持文件上传的服务接口。 5. **配置文件上传字段** 转到`Files Upload`选项卡,并在此处定义要上传文件的相关信息: - `File Path`: 提供本地磁盘上待上传文件的实际路径。 - `Parameter Name`: 对应于服务端接收文件所使用的名称(通常由开发人员提供)。 - `MIME Type`: 根据文件类型选择合适的MIME类型,例如图片可以选择`image/jpeg`或者`application/octet-stream`表示任意二进制数据流。 6. **其他必要参数** 如果还有额外的表单字段伴随文件一起提交,则可以在同一HTTP请求内的`Parameters`标签页里补充这些键值对。 7. **验证结果监听器** 添加查看结果树(View Results Tree)或其他类型的监听器以便观察响应情况。 #### 示例代码片段 下面是一个简单的例子展示如何构建这样的场景: ```java // 假设我们正在向 http://example.com/upload 发送 POST 请求以上传名为 'file' 的图像文件 POST /upload HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="description" This is a test description. ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="file"; filename="test.jpg" Content-Type: image/jpeg < file content here > ------WebKitFormBoundary7MA4YWxkTrZu0gW-- ``` 上述示例展示了标准的多部件(Multipart)编码格式下的文件上传过程[^4]。 --- #### 注意事项 - 确保客户端机器有足够的权限访问被选作输入源的文件位置。 - 测试期间可能遇到因网络延迟引起的超错误等问题,适当调整默认连接超间可能会有所帮助。 - 当处理大尺寸文件或多批次连续写入任务,请考虑优化资源分配策略,比如增加Java虚拟机堆大小设置如前所述那样修改bat脚本文件来适应更高的内存消耗需求[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值