1、环境准备:
-
- <dependency>
- <groupId>commons-httpclientgroupId>
- <artifactId>commons-httpclientartifactId>
- <version>3.1version>
- dependency>
- <dependency>
- <groupId>org.apache.httpcomponentsgroupId>
- <artifactId>httpmimeartifactId>
- <version>4.5.3version>
- 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
headers, String body,List 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
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
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
multiFiles = new ArrayList(); - for(File tempFile:files){
- MultipartFile cMultiFile = getMultipartFile(tempFile);
- multiFiles.add(cMultiFile);
- }
- String restr = sendFilePost(url, null, JSON.toJSONString(paramMap),multiFiles,"file");
- }