http post访问文件上传接口,传递MultipartFile[]多文件和其他参数
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;
}