http post访问文件上传接口,传递MultipartFile[]多文件和其他参数

时间:2025-03-20 09:52:01
package com.example.demo.uploadFile; import com.google.common.collect.Maps; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.lang3.ArrayUtils; import org.apache.http.*; 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.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; import java.util.HashMap; import java.util.Map; /** * @author : * @date : * @description : * @modifiedBy : */ public class FileUtil { /** * file转MultipartFile * * @param file 本地文件路径 * @return */ public static MultipartFile fileToMultipartFile(File file) { FileItem fileItem = createFileItem(file); MultipartFile multipartFile = new CommonsMultipartFile(fileItem); return multipartFile; } private static FileItem createFileItem(File file) { FileItemFactory factory = new DiskFileItemFactory(16, null); FileItem item = factory.createItem("textField", "text/plain", true, file.getName()); int bytesRead = 0; byte[] buffer = new byte[8192]; try { FileInputStream fis = new FileInputStream(file); OutputStream os = item.getOutputStream(); while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) { os.write(buffer, 0, bytesRead); } os.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } return item; } /** * 发送multipartFile * * @param url 请求路径 // * @param file MultipartFile流 // * @param fileParamName controller对应的接收名称 * @param headerParams 追加的请求头信息 * @param otherParams 其他请求参数 * @return */ public static HttpResultDTO postMultipartFile(String url, MultipartFile[] files, Map<String, String> headerParams, Map<String, String> otherParams) { CloseableHttpClient httpClient = HttpClients.createDefault(); try { HttpPost httpPost = new HttpPost(url); //添加header if (headerParams != null) { for (Map.Entry<String, String> e : headerParams.entrySet()) { httpPost.addHeader(e.getKey(), e.getValue()); } } MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(Charset.forName("utf-8")); //加上此行代码解决返回中文乱码问题 builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); //文件流处理 for (MultipartFile file : files) { String fileName = file.getOriginalFilename(); builder.addBinaryBody("files", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName); } if (otherParams != null) { for (Map.Entry<String, String> e : otherParams.entrySet()) { //追加其他请求参数信息 builder.addTextBody(e.getKey(), e.getValue(), ContentType.create("text/plain", Consts.UTF_8)); } } HttpEntity entity = builder.build(); httpPost.setEntity(entity); //执行提交 HttpResponse response = httpClient.execute(httpPost); HttpEntity responseEntity = response.getEntity(); StatusLine statusLine = response.getStatusLine(); int status = statusLine.getStatusCode(); Header[] headers = response.getAllHeaders(); String body = EntityUtils.toString(responseEntity); Map<String, String> headerMap = Maps.newHashMap(); if (ArrayUtils.isNotEmpty(headers)) { for (Header header : headers) { headerMap.put(header.getName(), header.getValue()); } } HttpResultDTO httpResultDTO = new HttpResultDTO(status, body, headerMap); System.out.println(httpResultDTO); return httpResultDTO; } catch (Exception e) { //打印日志 e.printStackTrace(); // ("postMultipartFile error,url:{},ex:{}", url, ()); } return null; } public static HttpResultDTO postFileWithParams(String url, String[] filesPath, String token, String params) { MultipartFile[] files = new MultipartFile[filesPath.length]; for (int i = 0; i < filesPath.length; i++) { File file = new File(filesPath[i]); MultipartFile multipartFile = fileToMultipartFile(file); files[i] = multipartFile; } Map<String, String> headerParams = new HashMap<>(); headerParams.put("token", token); Map<String, String> otherParams = new HashMap<>(); otherParams.put("params", params); return postMultipartFile(url, files, headerParams, otherParams); } public static void main(String[] args) { String url = "http://localhost:8081/v1/file/upload"; String token = ""; String params = ""; String[] filesPath = {"C:\\Users\\Admin\\Desktop\\7.","C:\\Users\\Admin\\Desktop\\7.6修.txt"}; HttpResultDTO httpResultDTO = postFileWithParams(url, filesPath, token, params); System.out.println(httpResultDTO); } } package com.example.demo.uploadFile; import lombok.AllArgsConstructor; import lombok.Data; import java.util.Map; /** * @author : * @date : * @description : * @modifiedBy : */ @Data @AllArgsConstructor public class HttpResultDTO { /** * 返回的状态码 */ private int status; /** * 返回的数据信息 */ private String body; /** * 返回的头信息 */ private Map<String, String> header; }