HttpConnect上传文件和参数

xiaoxiao2021-02-28  39

模拟前端上传文件请求, 接口可用用MultipartFile来接收文件,其他参数就以方法入参形式接收。   public Object uploadFile(@RequestParam("file") MultipartFile file, String filePn){     return null; }   package com.hq.test.test; import java.io.*; import java.net.*; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class Test { private static String requestUrl = "http://localhost:8080/test/uploadFile"; private static final int TIME_OUT = 8 * 1000; //超时时间 private static final String CHARSET = "utf-8"; //编码格式 private static final String PREFIX = "--"; //前缀 private static final String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成 private static final String CONTENT_TYPE = "multipart/form-data"; //内容类型 private static final String LINE_END = "\r\n"; //换行 public static void main(String[] args) { Map fileMap = new HashMap(); fileMap.put("Chrys.jpg", new File("D:\\Users\\Public\\Pictures\\Sample Pictures/Chrys.jpg")); Map strParams = new HashMap(); strParams.put("filePn", 0); strParams.put("source", 13); String result = doPost(strParams, fileMap); System.out.println(result); } public static String doPost(final Map<String, Object> strParams, final Map<String, File> fileParams){ HttpURLConnection conn = null; try { URL url = new URL(requestUrl); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setReadTimeout(TIME_OUT); conn.setConnectTimeout(TIME_OUT); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false);//Post 请求不能使用缓存 //设置请求头参数 conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Charset", "UTF-8"); conn.setRequestProperty("Content-Type", CONTENT_TYPE+";boundary=" + BOUNDARY); /** * 请求体 */ //上传参数 DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); //getStrParams()为一个 dos.writeBytes( getStrParams(strParams).toString() ); dos.flush(); //文件上传 StringBuilder fileSb = new StringBuilder(); for (Map.Entry<String, File> fileEntry: fileParams.entrySet()){ fileSb.append(PREFIX) .append(BOUNDARY) .append(LINE_END) /** * 这里重点注意: name里面的值为服务端需要的key 只有这个key 才可以得到对应的文件 * filename是文件的名字,包含后缀名的 比如:abc.png */ .append("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileEntry.getKey() + "\"" + LINE_END) .append("Content-Type: image/jpg" + LINE_END) //此处的ContentType不同于 请求头 中Content-Type .append("Content-Transfer-Encoding: 8bit" + LINE_END) .append(LINE_END);// 参数头设置完以后需要两个换行,然后才是参数内容 dos.writeBytes(fileSb.toString()); dos.flush(); InputStream is = new FileInputStream(fileEntry.getValue()); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1){ dos.write(buffer,0,len); } is.close(); dos.writeBytes(LINE_END); } //请求结束标志 dos.writeBytes(PREFIX + BOUNDARY + PREFIX + LINE_END); dos.flush(); dos.close(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder response = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { response.append(line); } return response.toString(); } catch (Exception e) { e.printStackTrace(); }finally { if (conn!=null){ conn.disconnect(); } } return ""; } /** * 对post参数进行编码处理 * */ private static StringBuilder getStrParams(Map<String,Object> strParams){ StringBuilder strSb = new StringBuilder(); if(strParams != null && !strParams.isEmpty()){ for (Map.Entry<String, Object> entry : strParams.entrySet() ){ strSb.append(PREFIX) .append(BOUNDARY) .append(LINE_END) .append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINE_END) .append("Content-Type: text/plain; charset=" + CHARSET + LINE_END) .append("Content-Transfer-Encoding: 8bit" + LINE_END) .append(LINE_END)// 参数头设置完以后需要两个换行,然后才是参数内容 .append(entry.getValue()) .append(LINE_END); } } return strSb; } }

 

转载请注明原文地址: https://www.6miu.com/read-2613875.html

最新回复(0)