Jmeter:上传文件或图片失效问题
方法一:通过勾选『对POST使用multipart/form-data;』
注意坑
手动设置Content-Type后,该方法失效。需要在预处理程序中,移除:Content-Type,移除代码如下:
添加JSR223 预处理程序(Java):
// 在低版本Jmeter可能不成功,在5.3版本中,该脚本测试通过
sampler.getHeaderManager().removeHeaderNamed("Content-Type");
但移除后,后续的接口如果仍然想要设置默认Content-Type,则需要添加JSR223 后置处理程序(Java):
import org.apache.jmeter.protocol.http.control.Header;
// 创建Header,需要导入
Header header = new Header("Content-Type","application/json; charset=UTF-8");
// 添加Header
sampler.getHeaderManager().add(header);
除此之外,上传文件的名字为中文时,会乱码,解决方案参考:https://blog.csdn.net/qq_18298049/article/details/106817246
传参:
普通参数:
Content-Disposition: form-data; name="productId"
# 以上类型的参数,在Jmeter中通过『参数tab』添加
文件:
Content-Disposition: form-data; name="file"; filename="测试条款.pdf"
Content-Type: application/pdf
# 以上类型的参数,在Jmeter中通过『文件上传』添加,其中:
# - name:对应Jmeter的参数名称
# - filename:对应Jmeter的文件名称(全路径)
# - Content-Type:对应Jmeter的MIME类型
方法二:直接构建参数(留下疑问:通过__FileToString为什么会导致文件失效)
创建Post请求后,该方法只适合上传文本,不适合图片、PDF等上传,因为__FileToString方法会导致该类文件失效,上传后文件不可用。
除此之外,还需注意:参数,编码格式,请求头,boundary
请求参数
注意设置上传文件的name,filename,Content-Type及调用__FileToString生成文件内容
--edc290560458f57dad9d94d0b7a2f03e7f2ae30f133b85756a659cfcdf39
Content-Disposition: form-data; name="productId"
581
--edc290560458f57dad9d94d0b7a2f03e7f2ae30f133b85756a659cfcdf39
Content-Disposition: form-data; name="file"; filename="测试条款.pdf"
Content-Type: application/pdf
${__FileToString(C:\Users\DELL\Desktop\v3.7.3迭代\testProduct.pdf,utf-8,)}
--edc290560458f57dad9d94d0b7a2f03e7f2ae30f133b85756a659cfcdf39--
编码格式
在调用__FileToString函数时,注意使用『正确(如utf-8)』格式,否则乱码
请求头
使用该方法实现文件上传时,注意覆盖接口的请求头Content-Type,设置为:
# 通过HTTP信息头管理器设置,boundary可自定义
Content-Type: multipart/form-data; boundary=edc290560458f57dad9d94d0b7a2f03e7f2ae30f133b85756a659cfcdf39
boundary
注意boundary的值,需要与请求参数中的boundary相同