You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的可能原因及修复方向

  1. 缺失Expect: 100-Continue请求头
    多数支持异步上传的服务要求客户端发送该头,告知服务器先验证请求合法性,再接收文件内容。若缺少此头,服务器可能同步处理请求并返回200。添加方式:

    requestBuilder.setHeader("Expect", "100-Continue")
    
  2. 未启用分块传输编码
    当前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);
    
  3. 请求参数或头信息不完整

    • 校验${namespaceid}、${sid_value}等变量是否与正常请求(如浏览器/Postman请求)取值一致;
    • 若不使用分块,需手动设置Content-Length头告知服务器文件大小:
      def file = new File(sampleFilePath);
      def entity = new InputStreamEntity(new FileInputStream(file), file.length());
      
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:42:15