今天用公司本身封裝的框架開發時,忽然須要向服務器上傳文件,經過查找資料,發現兩種方式能夠相對方便的接收文件。
java
方法一:request.getPart("web端的文件標籤名");web
getPart()是servlet3.0新增的方法,並且須要tomcat7.0以上的版本,web.xml的version在3.0以上,使用getPart()須要注意的是要對servlet使用@MultipartConfig()註解,不然獲得結果是空的。tomcat
File filePath = new File(realPath); if(!filePath.exists()) filePath.mkdirs(); Part part = req.getPart("upload"); InputStream in = part.getInputStream(); OutputStream out = new FileOutputStream(realPath + fileName); byte[] buffer = new byte[1024]; int length = -1; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } in.close(); out.close();
方法二:先讀取輸入流,在取文件在流的位置,在寫入文件
服務器
讀取輸入流框架
/** * 讀取流 * @param request * @return * @throws IOException */ private byte[] readBody(HttpServletRequest request) throws IOException { //獲取請求文本字節長度 int formDataLength = request.getContentLength(); //取得ServletInputStream輸入流對象 DataInputStream dataStream = new DataInputStream(request.getInputStream()); byte body[] = new byte[formDataLength]; int totalBytes = 0; while (totalBytes < formDataLength) { int bytes = dataStream.read(body, totalBytes, formDataLength); totalBytes += bytes; } return body; }
獲取文件內容在流數據的位置
this
/** * 流中文件的位置 * @author lenovo * */ class Position { int begin; int end; public Position(int begin, int end) { this.begin = begin; this.end = end; } } /** * 獲取文件流的位置 * @param request * @param textBody * @return * @throws IOException */ private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException { //取得文件區段邊界信息 String contentType = request.getContentType(); String boundaryText = contentType.substring(contentType.lastIndexOf("=") + 1, contentType.length()); //取得實際上傳文件的氣勢與結束位置 int pos = textBody.indexOf("filename=\""); pos = textBody.indexOf("\n", pos) + 1; pos = textBody.indexOf("\n", pos) + 1; pos = textBody.indexOf("\n", pos) + 1; int boundaryLoc = textBody.indexOf(boundaryText, pos) - 4; int begin = ((textBody.substring(0, pos)).getBytes("ISO-8859-1")).length; int end = ((textBody.substring(0, boundaryLoc)).getBytes("ISO-8859-1")).length; return new Position(begin, end); }
寫入文件
spa
/** * 流寫入文件 * @param fileName * @param body * @param p * @throws IOException */ private void writeTo(String fileName, byte[] body, Position p) throws IOException { FileOutputStream fileOutputStream = new FileOutputStream(fileName); fileOutputStream.write(body, p.begin, (p.end - p.begin)); fileOutputStream.flush(); fileOutputStream.close(); }
以上就是全部的核心代碼,以後能夠繼續深刻研究,從新封裝。
code