本文主要是介绍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");
}
这篇关于HttpClient发送MultipartFile多文件及多参数请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!