import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ResourceUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* description接口调用类
* 2021/6/28
* @author
**/
@Component//被spring扫描 关键注解
public class SendPostUntil {
private static final String BOUNDARY = "-------45962402127348";
private static final String FILE_ENCTYPE = "multipart/form-data";
public static String Post(String urlStr, Map<String, String> params,
Map<String,File> files) {
StringBuffer stringbuffer = new StringBuffer();
InputStreamReader inputStreamReader;
InputStream is = null;
try {
URL url = new URL(urlStr);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(5000);
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type", FILE_ENCTYPE + "; boundary="
+ BOUNDARY);
StringBuilder sb = null;
DataOutputStream dos = new DataOutputStream(con.getOutputStream());;
if (params != null) {
sb = new StringBuilder();
for (String s : params.keySet()) {
sb.append("--");
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data; name=\"");
sb.append(s);
sb.append("\"\r\n\r\n");
sb.append(params.get(s));
sb.append("\r\n");
}
dos.write(sb.toString().getBytes());
}
if (files != null) {
for (String s : files.keySet()) {
File f = files.get(s);
sb = new StringBuilder();
sb.append("--");
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data; name=\"");
sb.append(s);
sb.append("\"; filename=\"");
sb.append(f.getName());
sb.append("\"\r\n");
sb.append("Content-Type: multipart/form-data");//这里注意!如果上传的不是图片,要在这里改文件格式,比如txt文件,这里应该是text/plain
sb.append("\r\n\r\n");
dos.write(sb.toString().getBytes());
FileInputStream fis = new FileInputStream(f);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
dos.write(buffer, 0, len);
}
dos.write("\r\n".getBytes());
fis.close();
}
sb = new StringBuilder();
sb.append("--");
sb.append(BOUNDARY);
sb.append("--\r\n");
dos.write(sb.toString().getBytes());
}
dos.flush();
if (con.getResponseCode() == 200){
is = con.getInputStream();
}
dos.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStreamReader = new InputStreamReader(is, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
stringbuffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
is.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return stringbuffer.toString();
}
public static void doPost(String url,String data,String fileName) throws FileNotFoundException {
//获取项目路径
File path = new File(ResourceUtils.getURL("tmpl").getPath());
String filePath = path + File.separator + "report" + File.separator + fileName;
System.out.println(filePath);
File fil = new File(filePath);
if (!fil.exists()) { //如果 module文件夹不存在
fil.mkdir(); //创建文件夹
}
FileOutputStream fileOut = null;
HttpURLConnection conn = null;
InputStream inputStream = null;
OutputStreamWriter out = null;
try
{
// 建立链接
URL httpUrl=new URL(url);
conn=(HttpURLConnection) httpUrl.openConnection();
//以Post方式提交表单,默认get方式
conn.setRequestMethod("POST");
//设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
conn.setDoInput(true);
conn.setDoOutput(true);
// post方式不能使用缓存
conn.setUseCaches(false);
//连接指定的资源
conn.connect();
out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
//发送请求参数即数据
out.write(data);
//flush输出流的缓冲
out.flush();
//获取网络输入流
inputStream=conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
//判断文件的保存路径后面是否以/结尾
if (!filePath.endsWith("/")) {
filePath += "/";
}
//写入到文件(注意文件保存路径的后面一定要加上文件的名称)
fileOut = new FileOutputStream(filePath+"\\"+fileName+".doc");
BufferedOutputStream bos = new BufferedOutputStream(fileOut);
byte[] buf = new byte[4096];
int length = bis.read(buf);
//保存文件
while(length != -1)
{
bos.write(buf, 0, length);
length = bis.read(buf);
}
bos.close();
bis.close();
conn.disconnect();
} catch (Exception e)
{
e.printStackTrace();
System.out.println("抛出异常!!");
}
}
//multipartFileToFile 转 File
public static File multipartFileToFile(MultipartFile file) throws Exception {
File toFile = null;
if (file.equals("") || file.getSize() <= 0) {
file = null;
} else {
InputStream ins = null;
ins = file.getInputStream();
toFile = new File(file.getOriginalFilename());
inputStreamToFile(ins, toFile);
ins.close();
}
return toFile;
}
/**
* 获取流文件
* @param ins
* @param file
*/
public static void inputStreamToFile(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Autowired
private RestTemplate restTemplate;
private static final Logger logger = LoggerFactory.getLogger(SendPostUntil.class);
public Object getHttpDataFile(String uri, List<MultipartFile> files, Object reqObJect) throws Exception {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
// post方法
logger.info("getHttpDataFile start HttpEntity0, restTemplate == null?{}", (restTemplate == null));
logger.info("getHttpDataFile start HttpEntity1, uri: {}", uri);
MultiValueMap<String, Object> bodyParams = new LinkedMultiValueMap<String, Object>();
FileSystemResource resource = null;
for (int i = 0; i < files.size(); i++) {
MultipartFile f = files.get(i);
String originalFilename = f.getOriginalFilename();
byte[] bytes = f.getBytes();
ByteArrayResource contentsAsResource = new ByteArrayResource(bytes) {
@Override
public String getFilename() {
return "files";
}
};
bodyParams.add("files",contentsAsResource);
}
bodyParams.add("userName", reqObJect);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(bodyParams, httpHeaders);
logger.info("getHttpDataFile start HttpEntity2, uri: {}", uri);
Object object = restTemplate.postForObject(uri, requestEntity, Object.class);
logger.info("getHttpDataFile start HttpEntity3, uri: {}", uri);
logger.info("getHttpDataFile start HttpEntity3, object == null ? {}", (object == null));
if (object != null) {
logger.info("接口调用结果, object: {}", object);
}
return object;
}
}