k6上传文件需用http.file()自动生成multipart/form-data;JMeter大文件应改用JSR223流式发送;C#须复用HttpClient并禁用Expect100Continue;文件名与内容须动态生成以避免校验失败。

k6 上传文件时 multipart/form-data 构造失败
直接用 k6 的 http.post() 发原始二进制,服务端收不到 file 字段——因为没按 multipart/form-data 规范拼边界(boundary)、头字段和分段结构。
必须手动生成符合 RFC 7578 的请求体,不能只传 body: fileBytes。
- 用
http.file()加载本地文件,它返回一个带filename和contentType的对象,k6会自动处理 boundary 和分段封装 - 确保
Content-Type不手动设,留空让k6自动注入带随机 boundary 的multipart/form-data; boundary=... - 如果 API 要求额外字段(如
userId),得和文件一起放进formData对象,不能塞在 headers 里
import http from 'k6/http';
export default function () {
const data = {
file: http.file(open('./test.pdf', 'b'), 'test.pdf', 'application/pdf'),
userId: '123',
};
http.post('https://api.example.com/upload', data);
}JMeter 中 HTTP 请求默认不支持二进制文件流
用 JMeter 的「HTTP Request」加「Files Upload」面板上传大文件时,若响应是 400 Bad Request 或 413 Payload Too Large,大概率是 JMeter 默认把整个文件读进内存再发,触发了服务端或 JMeter 自身的缓冲限制。
根本原因不是配置漏了,而是 JMeter 的「Upload File with HTTP Request」本质是内存加载 + 拼接字符串,对 >10MB 文件极易 OOM 或超时。
- 启用「Use multipart/form-data for POST」必须勾选,否则字段全丢
- 大文件测试前,在
jmeter.properties里调大:httpclient4.request.buffer.size=10485760(10MB) - 更稳妥的做法:改用 JSR223 Sampler + Groovy,用
FileInputStream分块读取 +HttpURLConnection流式发送,绕过 JMeter 内存瓶颈
C# 客户端上传逻辑影响压测真实性
如果你用 C# 写的压测脚本(比如基于 HttpClient)去打接口,但并发一高就大量 HttpRequestException 或连接超时,问题常不在服务端,而在客户端未复用连接或未调优。
HttpClient 实例必须全局复用,否则每请求新建实例会快速耗尽本地端口(TIME_WAIT 状态堆积)。
- 绝不要在循环里 new
HttpClient();用静态单例或IHttpClientFactory(.NET Core+) - 上传大文件时,禁用
HttpClient.Timeout(设为TimeSpan.MaxValue),避免被默认 100 秒截断 - 检查是否启用了
Expect: 100-continue(.NET 默认开启),某些 Nginx 配置下会导致额外 RTT 延迟,可在HttpClientHandler中关掉:serverCertificateValidationCallback无关,重点是Expect100Continue设为false
文件内容重复导致服务端校验失败
压测跑着跑着出现大量 409 Conflict 或 500 Internal Server Error,查日志发现是文件名冲突、MD5 重复或业务唯一性校验失败——说明你用了固定文件(如始终传 report.pdf),而服务端做了去重或幂等控制。
真实用户不会反复传同一份文件,压测要模拟差异性。
- 用
__uuid或时间戳动态生成文件名:file_${__time(yyyyMMddHHmmss)}.pdf(JMeter)或$"{Guid.NewGuid()}.pdf"(C#) - 若需保持文件内容可变,别用
open()一次性读全,改用FileStream+Random在内存构造不同字节流(适合小文件) - k6 不支持运行时生成二进制流,所以必须提前生成一批不同内容的测试文件,用
__ENV.FILE_INDEX轮询读取
文件上传压测最麻烦的从来不是发请求,而是让每个请求看起来像“不同的人在不同时间传不同的文件”——边界、命名、连接、内容,四者只要一个卡住,数据就失真。










