servlet接收web上傳文件

        今天用公司本身封裝的框架開發時,忽然須要向服務器上傳文件,經過查找資料,發現兩種方式能夠相對方便的接收文件。
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

相關文章
相關標籤/搜索