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; } }
HttpClient调用接口,参数类型为文件;RestTemplate 调用接口。
最新推荐文章于 2023-11-21 09:46:30 发布