最近,在一个项目中,需要写一个性能测试工具,来对HTTP协议的服务端进行压力测试。为了能够提供足够的压力,考虑使用httpclient提供的HttpAsyncClients 来发送异步请求。由于,模拟的部分请求中会有文件上传的操作,因此,在构造POST请求的时候,使用了MultipartEntity ,结果实际运行是发现,程序并不能正确运行,而是抛出异常:
java.lang.UnsupportedOperationException: Multipart form entity does not implement #getContent()
通过查阅资料,才发现,原来在异步模式下,并不能使用MultipartEntity来进行数据传递,如果需要在一步的方式下提交文件,可以考虑采用以下方式:
File file = new File(filePath);
ByteArrayBody body;
body = new ByteArrayBody(FileUtils.readFileToByteArray(file), file.getName());
HttpEntity mEntity = MultipartEntityBuilder.create()
.setBoundary("-------------" + boundary)
.addPart("file", body)
.build();
ByteArrayOutputStream baoStream = new ByteArrayOutputStream();
mEntity.writeTo(baoStream);
HttpEntity nByteEntity = new NByteArrayEntity(baoStream.toByteArray(), ContentType.MULTIPART_FORM_DATA);
httppost.setEntity(nByteEntity );
用这种方式构建NByteArrayEntity 能够实现异步上传文件。