JMeter中JSR223采样器上传文件异常:返回200而非预期202
问题
使用JSR223采样器执行代码上传图片文件,当前返回200状态码,但预期应返回202 Accepted,请问遗漏了什么?
代码片段
def storageProtocol = "https"; def storageServer = "qatestserver.com" def newImageFilePath = vars.get('filePathUUIDA_' + ((vars.get('__jm__namespace_iterator__idx') as int) + 1)); def imageFilePath = newImageFilePath.toString(); def sampleFilePath = imageFilePath.replace("\\","\\\\"); def RequestConfig uploadRequestConfig = RequestConfig.custom() .setConnectTimeout(30000) .setSocketTimeout(30000) .build(); def uploadUriBuilder = new URIBuilder().setScheme(storageProtocol) .setHost(storageServer); def URI uri = uploadUriBuilder.setPath("/api/v3/storage/namespace/" + "${namespaceid}" + "/image") .setParameter("sid", "${sid_value}") .setParameter("test_uid", "${test_code}") .setParameter("image_uid", "${imageuuid}") .build(); def RequestBuilder requestBuilder = RequestBuilder.create("POST") .setConfig(uploadRequestConfig) .setUri(uri) .setHeader("X-AmbraHealth-SID", "${sid_value}") .setHeader("X-Requested-With", "XMLHttpRequest") .setHeader("X-DicomGrid-Client", "USER") .setHeader("X-DicomGrid-Version", "3.22.5.0") .setHeader("X-File-Name", "555210_98168_98980_0.img") .setHeader("Referer", "https://qatestserver.com/load.html?namespace=${namespaceid}") .setHeader(HttpHeaders.CONTENT_TYPE, "application/dicom"); def InputStreamEntity entity = new InputStreamEntity(new FileInputStream(sampleFilePath)); log.info("Entity Value : "+ entity +" Sample File Path : " +sampleFilePath); requestBuilder.setEntity(entity); <Code for post call>
日志信息
2023-07-16 20:05:01,903 INFO o.a.j.p.j.s.J.ImageUpload: Entity Value : [Chunked: false] Sample File Path : C:\PerformanceTestFiles\555210_98168_98980_0.img;
另外,[Chunked: false]是什么意思?
解答
一、返回200而非202的可能原因及修复方向
缺失
Expect: 100-Continue请求头
多数支持异步上传的服务要求客户端发送该头,告知服务器先验证请求合法性,再接收文件内容。若缺少此头,服务器可能同步处理请求并返回200。添加方式:requestBuilder.setHeader("Expect", "100-Continue")未启用分块传输编码
当前InputStreamEntity默认未开启分块,部分服务需要分块上传触发异步流程。可通过两种方式调整:// 方式1:使用FileEntity自动处理文件大小与编码 def entity = new FileEntity(new File(sampleFilePath), ContentType.create("application/dicom")); // 方式2:给InputStreamEntity手动开启分块 def entity = new InputStreamEntity(new FileInputStream(sampleFilePath), -1); // -1表示启用分块 entity.setChunked(true);请求参数或头信息不完整
- 校验
${namespaceid}、${sid_value}等变量是否与正常请求(如浏览器/Postman请求)取值一致; - 若不使用分块,需手动设置
Content-Length头告知服务器文件大小:def file = new File(sampleFilePath); def entity = new InputStreamEntity(new FileInputStream(file), file.length());
- 校验
POST请求执行逻辑缺失
代码中<Code for post call>部分未实现请求发送逻辑,需补充完整的请求执行代码:def httpClient = HttpClientBuilder.create().build(); def response = httpClient.execute(requestBuilder.build()); log.info("Response status: " + response.getStatusLine().getStatusCode()); // 关闭资源 response.close(); httpClient.close();
二、[Chunked: false]的含义
这表示当前请求实体未使用分块传输编码(Chunked Transfer Encoding):
- 分块传输是HTTP的一种传输机制,允许将请求体拆分为多个块依次发送,无需提前知晓整体内容长度,适合大文件上传场景;
Chunked: false意味着请求会一次性发送完整文件内容,且需要在请求头中携带Content-Length告知服务器文件大小。若未设置该头,服务器可能无法正确解析请求体,或采用同步处理方式返回200而非202。
内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick
相关产品推荐
相关产品推荐

