java 模拟http文件上传,HttpURLConnection上传多文件
生活随笔
收集整理的這篇文章主要介紹了
java 模拟http文件上传,HttpURLConnection上传多文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
public static String sendFile(final String url, byte[] file, String filename) throws Exception{final String boundary = "===" + Long.toHexString(System.currentTimeMillis()) + "===";//分割線final String CRLF = "\r\n";HttpURLConnection httpConn = null;try {httpConn = (HttpURLConnection) new URL(url).openConnection();httpConn.setConnectTimeout(5 * 1000);httpConn.setRequestProperty("Connection", "close");httpConn.setDoOutput(true);httpConn.setDoInput(true);httpConn.setUseCaches(false);httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);httpConn.connect();try (OutputStream output = httpConn.getOutputStream();PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true)) {writer.append("--" + boundary).append(CRLF).append("Content-Disposition: form-data; name=file; filename=" + filename).append(CRLF).append(new StringBuilder("Content-Type:").append( URLConnection.guessContentTypeFromName(filename) ).append("; charset=UTF-8")).append(CRLF).append("Content-Transfer-Encoding: binary").append(CRLF).append(CRLF).flush();output.write(file);output.flush();writer.append(CRLF).flush();writer.append("--" + boundary + "--").append(CRLF).flush();//http1.1是半雙工模式,必須寫完成之后再拿服務端的inputStreamtry (InputStream inputStream = httpConn.getInputStream()){byte[] resByte = new byte[ inputStream.available() ];inputStream.read(resByte);String res = new String(resByte);System.out.println(res);return res;}}} finally {if (httpConn != null){httpConn.disconnect();}}}
main方法進行測試:
public static void main(String[] args) throws Exception {FileChannel fileChannel = FileChannel.open( Paths.get("B:\\documents\\mycat.pdf") );ByteBuffer byteBuffer = ByteBuffer.allocate( (int) fileChannel.size() );fileChannel.read(byteBuffer);sendFile("http://localhost:8097/api/save", byteBuffer.array(), "mycat-pdf");}springmvc后端接口接收:
@RequestMapping(value = "/save", method = RequestMethod.POST)public LllFile save(@RequestParam(name = "file") MultipartFile multipartFile, String filename, String usrId, String acct){try{byte[] file = multipartFile.getBytes();LllFile res = iFileService.saveFile(file, filename, usrId, acct);return res;}catch(Exception ex){log.error("", ex);}return null;}純servlet接收,通過request的getPart方法:
@RequestMapping(value = "/save", method = RequestMethod.POST) public LllFile save(HttpServletRequest request) throws IOException, ServletException {Collection<Part> parts = request.getParts();for (Part part : parts) {System.out.println(part.getSize());System.out.println("文件名:" + part.getSubmittedFileName());} return null; }上傳多個文件:
1:首先查看瀏覽器是怎么區分多文件的;
-----Webkit***是chrome用來區分文件的,最后一個boundary后面多了個--。
java實現如下:
public static String sendMultipleFile(Map<String, byte[]> fileMsgMap, final String url) throws Exception {final String boundary = "===" + Long.toHexString(System.currentTimeMillis()) + "===";//分割線final String CRLF = "\r\n";HttpURLConnection httpConn = null;try {httpConn = (HttpURLConnection) new URL(url).openConnection();httpConn.setConnectTimeout(5 * 1000);httpConn.setRequestProperty("Connection", "close");httpConn.setDoOutput(true);httpConn.setDoInput(true);httpConn.setUseCaches(false);httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);httpConn.connect();try (OutputStream output = httpConn.getOutputStream();PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"), true)) {for (Map.Entry<String, byte[]> entry : fileMsgMap.entrySet()) {writer.append("--" + boundary).append(CRLF).append("Content-Disposition: form-data; name=files; filename=" + entry.getKey()).append(CRLF).append(new StringBuilder("Content-Type:").append( URLConnection.guessContentTypeFromName(entry.getKey()) ).append("; charset=UTF-8")).append(CRLF).append("Content-Transfer-Encoding: binary").append(CRLF).append(CRLF).flush();output.write(entry.getValue());output.flush();writer.append(CRLF).flush();}//最后一行末尾多個--writer.append("--" + boundary + "--").append(CRLF).flush();//http1.1是半雙工模式,必須寫完成之后再拿服務端的inputStreamtry (InputStream inputStream = httpConn.getInputStream()){byte[] resByte = new byte[ inputStream.available() ];inputStream.read(resByte);String res = new String(resByte);System.out.println(res);return res;}}} finally {if (httpConn != null){httpConn.disconnect();}}}springmvc接收代碼:
@PostMapping(path = "/up")@ResponseBodypublic String upFile(@RequestParam(name = "files") MultipartFile[] multipartFiles, HttpServletRequest request) throws IOException, ServletException { // Collection<Part> parts = request.getParts(); // for (Part part : parts) { // System.out.println(part.getSize()); // System.out.println("文件名:" + part.getSubmittedFileName()); // }System.out.println(multipartFiles);System.out.println(multipartFiles.length);for (MultipartFile file : multipartFiles) {System.out.println("文件名是:" + file.getOriginalFilename());System.out.println("文件信息大小是:" + file.getBytes().length);}return "ok";}上傳多個文件最好修改tomcat的最大post請求大小限制,
server:tomcat:max-http-form-post-size: 40MB或者
server:tomcat:#30Mb最大post請求體max-http-post-size: 31457280 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java 模拟http文件上传,HttpURLConnection上传多文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jvm gc日志
- 下一篇: redis便捷启动,shell启动red