应用不支持MultipartEntityBuilder,JSR223 Sampler上传DICOM文件失败如何解决?
解决JSR223 Sampler上传DICOM文件时应用不支持multipart entity的问题
问题描述
我尝试通过JSR223 Sampler执行以下脚本,在请求体中上传一张DICOM格式的图片文件,但由于我的应用不支持multipart entity,脚本执行失败。
原脚本:
import org.apache.http.HttpHeaders import org.apache.http.client.methods.HttpPost import org.apache.http.entity.ContentType import org.apache.http.entity.mime.HttpMultipartMode import org.apache.http.entity.mime.MultipartEntityBuilder import org.apache.http.impl.client.HttpClients def imageFileName = "C:\\Users\\IMAGES\\IMG00001.dcm" def urlRequest = 'https://' + ${BASE_URL_1} + '/api/v3/storage/namespace/7c762733-009f-4527-81ea-571d1cf6e9d2/image?sid=' + vars.get('SIDVALUE') + '&study_uid=1.2.300.0.7230010.3.1.2.2595064201.8112.1216202112026121&image_uid=1.2.840.113704.7.1.0.1356918323635126.1521373008.110' def postRequest = new HttpPost(urlRequest); def file = new File(imageFileName); def builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, imageFileName); def entity = builder.build(); postRequest.setEntity(entity); def header = new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/dicom"); def headers = Arrays.asList(header) def client = HttpClients.custom().setDefaultHeaders(headers).build() def response = client.execute(postRequest);
解决方案
由于目标应用不支持multipart格式,需直接将DICOM文件的二进制内容作为请求体发送,无需封装为multipart entity。修改后的脚本如下:
import org.apache.http.HttpHeaders import org.apache.http.client.methods.HttpPost import org.apache.http.entity.FileEntity import org.apache.http.impl.client.HttpClients import org.apache.http.message.BasicHeader def imageFileName = "C:\\Users\\IMAGES\\IMG00001.dcm" // 构建请求URL(修正变量引用方式,避免语法错误) def urlRequest = 'https://' + vars.get('BASE_URL_1') + '/api/v3/storage/namespace/7c762733-009f-4527-81ea-571d1cf6e9d2/image?sid=' + vars.get('SIDVALUE') + '&study_uid=1.2.300.0.7230010.3.1.2.2595064201.8112.1216202112026121&image_uid=1.2.840.113704.7.1.0.1356918323635126.1521373008.110' def postRequest = new HttpPost(urlRequest); def file = new File(imageFileName); // 直接将文件二进制内容作为请求实体,设置正确的Content-Type def entity = new FileEntity(file, "application/dicom") postRequest.setEntity(entity) // 创建默认HTTP客户端并执行请求 def client = HttpClients.createDefault() def response = client.execute(postRequest) // 可选:打印响应状态码用于调试 log.info("请求响应状态码: " + response.getStatusLine().getStatusCode())
关键修改说明
- 移除所有
MultipartEntityBuilder相关代码,避免生成multipart格式请求体 - 使用
FileEntity直接封装DICOM文件的二进制内容,作为请求体发送 - 修正
BASE_URL_1的引用方式:原脚本直接使用${BASE_URL_1}会导致语法错误,改为vars.get('BASE_URL_1')通过JMeter变量管理器获取值 - 简化HTTP客户端创建逻辑,若需自定义请求头可保留原方式,但此处Content-Type已通过
FileEntity直接设置
内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick
相关产品推荐
相关产品推荐

