HttpClient发送MultipartFile多文件及多参数请求
1、环境准备:
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.3</version>
</dependency>
2、Java中发送httpClient请求:
/**
* HttpClient post multipart/form-data数据实现多文件上传
* @param url
* @param headers 头部参数
* @param body body参数,json字符串
* @param multipartFiles 文件列表
* @param fileParName 接收的文件名
* @return
*/
public static String sendFilePost(String url, Map<String, String> headers, String body,List<MultipartFile> multipartFiles,String fileParName) {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(java.nio.charset.Charset.forName("UTF-8"));
//单个文件
String fileName = null;
MultipartFile multipartFile = null;
for (int i = 0; i < multipartFiles.size(); i++) {
//第一个参数为 相当于 Form表单提交的file框的name值 第二个参数就是我们要发送的InputStream对象了
//第三个参数是文件名
//3)
multipartFile = multipartFiles.get(i);
fileName = multipartFile.getOriginalFilename();
InputStream inputStream = null;
try {
inputStream = multipartFile.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
builder.addBinaryBody(fileParName,inputStream, ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
}
//4)构建请求参数 普通表单项
/* StringBody stringBody = new StringBody("12", ContentType.MULTIPART_FORM_DATA);
builder.addPart("id", stringBody);*/
//决中文乱码
ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, Consts.UTF_8);
builder.addTextBody("paramStr", body, contentType);
HttpEntity entity = builder.build();
if (null!=headers&&headers.size()>0){
for (Map.Entry<String, String> entry : headers.entrySet()) {
httppost.addHeader(entry.getKey(),entry.getValue());
}
}
httppost.setEntity(entity);
CloseableHttpResponse response = null;
try {
response = httpclient.execute(httppost);
} catch (IOException e) {
logger.error("请求出错:" + url, e);
return null;
}
String result = null;
try {
if(response!=null){
HttpEntity httpEntity = response.getEntity();
if (httpEntity != null && response.getStatusLine().getStatusCode()== HttpURLConnection.HTTP_OK) {// 判断请求状态
result = EntityUtils.toString(httpEntity);
}
}
} catch (Exception e) {
logger.error("请求出错:" + url, e);
} finally {
try {
if(response!=null){
response.close();
}
} catch (IOException e) {
logger.error("请求出错:" + url, e);
}
}
logger.info("请求的URL:" + url + ", 返回结果:" + result);
return result;
}
3、后端服务restful接口接参:
@Operation(summary = "获取附件")
@PostMapping("/xxx")
private void sendfilepost(@RequestParam(value = "file") List<MultipartFile> mulFiles,@RequestParam(value = "paramStr") String json){
/**这里处理自己的逻辑*/
}
4、模拟2中调用
/**将普通文件转成MultipartFile文件*/
public static MultipartFile getMultipartFile(File file) {
FileItem item = new DiskFileItemFactory().createItem("file"
, MediaType.MULTIPART_FORM_DATA_VALUE
, true
, file.getName());
try (InputStream input = new FileInputStream(file);
OutputStream os = item.getOutputStream()) {
// 流转移
IOUtils.copy(input, os);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid file: " + e, e);
}
return new CommonsMultipartFile(item);
}
public static void main(String[] args) {
String url = "请求的服务路径";
File f = new File("D:\\test");
File[] files = f.listFiles();
List<MultipartFile> multiFiles = new ArrayList();
for(File tempFile:files){
MultipartFile cMultiFile = getMultipartFile(tempFile);
multiFiles.add(cMultiFile);
}
String restr = sendFilePost(url, null, JSON.toJSONString(paramMap),multiFiles,"file");
}