日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 模拟http文件上传,HttpURLConnection上传多文件

發(fā)布時間:2024/10/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 模拟http文件上传,HttpURLConnection上传多文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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是半雙工模式,必須寫完成之后再拿服務(wù)端的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:首先查看瀏覽器是怎么區(qū)分多文件的;

-----Webkit***是chrome用來區(qū)分文件的,最后一個boundary后面多了個--。

java實現(xiàn)如下:

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是半雙工模式,必須寫完成之后再拿服務(wù)端的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位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的java 模拟http文件上传,HttpURLConnection上传多文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。