JAVA web- 文件下載

1.讀取文件的兩種方式

1.1Servlet讀取

    ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/WEB-INF/classes/db.properties");
        InputStream inputStream = new FileInputStream(realPath);
        Properties properties = new Properties();
        properties.load(inputStream);

        String driverClass = properties.getProperty("driverClass");
        String url = properties.getProperty("url");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        System.out.println(driverClass);
        System.out.println(url);
        System.out.println(username);
        System.out.println(password);

1.2類加載器讀取

    public static void readFile() throws Exception{
//      使用類加載器來讀取文件

//      類加載器用來加載Class文件,將Class文件加載到內存
        InputStream inputStream = ReadFileUtils.class.getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);

        String driverClass = properties.getProperty("driverClass");
        String url = properties.getProperty("url");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        System.out.println(driverClass);
        System.out.println(url);
        System.out.println(username);
        System.out.println(password);
    }

2.文件下載

  • 兩種方式:

    超鏈接下載:直接將文件的路徑寫到超鏈接的href中—-有些文件的類型,瀏覽器不支持。
    第二種:手動編寫代碼

    • Content-type :文件的MIME類型
    • COntent-Disposition :以下載的形式打開文件
    • InputStream : 文件的輸入。

2.1超鏈接下載方式

    <h3>超鏈接方式下載link</h3>

    <a href = "/WebExercise/download/Control box  App Comparasion.xlsx">Control box  App Comparasion.xlsx</a><br>
    <a href = "/WebExercise/download/PW3RE001 EMEA.zip">PW3RE001 EMEA.zip</a><br>
    <a href = "/WebExercise/download/打印.pdf">打印.pdf</a><br>

2.2Servlet下載方式

<h3>手動編碼方式下載</h3>
        <a href = "/WebExercise/DownloadServlet?filename=Control box  App Comparasion.xlsx">Control box  App Comparasion.xlsx</a><br>
        <a href = "/WebExercise/DownloadServlet?filename=PW3RE001 EMEA.zip">PW3RE001 EMEA.zip</a><br>
        <a href = "/WebExercise/DownloadServlet?filename=打印.pdf">打印.pdf</a><br>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      1.接收數據
        String filename = request.getParameter("filename");
//      2.完成文件的下載

//      2。1設置Contenttype頭
        String type = this.getServletContext().getMimeType(filename);
        response.setHeader("Content-type", type);
//      2.2設置Content-disposition頭
        response.setHeader("Content-Disposition", "attachement;filename="+filename);
//      2.3設置文件的InputStream
        String realPath = this.getServletContext().getRealPath("/download/"+filename);
        InputStream inputStream = new FileInputStream(realPath);

//      獲得response的輸出流
        OutputStream outputStream = response.getOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = inputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, len);
        }
        inputStream.close();
    }

3.中文文件的下載

IE瀏覽器下載中文文件的時候,採用的是URL的編碼
Firefox連藍琪下載中文件的時候才用的還是Based64 編碼。

public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            // TODO: handle exception
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

4.response輸出相應內容的方法


  1. 想頁面響應的方法:

getOutputStream();
getWriter();
**使用的時候只能使用其中一種。

  1. 輸出中文亂碼的問題

字節流:
*設置瀏覽器的默認打開的編碼:
response.setHeader(“Content-type”, “text/html;charset=UTF-8”);
*設置中文字節取出的時候編碼:
“中文”.getBytes(“UTF-8”);
字符流:
*設置瀏覽器默認打開的編碼
response.setHeader(“Content-type”, “text/html;charset=UTF-8”);
*設置response的緩衝區的編碼
response.setCharacterEncoding(“UTF-8”);
*簡化寫法:response.setContentType(“text/html;charset=UTF-8”);

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      使用字節流響應數據:
//      response.getOutputStream().write("hello response i am tommy武藤蘭".getBytes());

//      使用字符流響應數據
//      response.getWriter().println("tommy i lvoe you");
//      response.getWriter().append("Served at:Tommy! ").append(request.getContextPath());
        test2(response);
    }

/*
 * 使用字節流輸出中文會不會有亂碼?
 * -----不一定。
 *          *設置中文轉成字節數組取出的時候編碼
 *          *設置瀏覽器默認打開的時候編碼
 * */   
    private void test1(HttpServletResponse response) throws IOException {
//      設置瀏覽器默認打開的時候採用的字節編碼
        response.setHeader("Content-type", "text/html;charset=UTF-8");
//      設置中文轉成字節數組的時候取出的編碼
        response.getOutputStream().write("蒼井空".getBytes("UTF-8"));
    }

    /*
     * 使用字符流輸出中文會不會有亂碼?
     * -----一定有,response使用的字符流有緩衝區。
     *          *response的字符流的緩衝區的默認的編碼是ISO-8859-1,編碼不支持中文。
     *          *設置response的字符流的緩衝區的編碼。
     *          *設置瀏覽器默認打開的時候所採用的字符編碼。
     * */   
        private void test2(HttpServletResponse response) throws IOException {
//          設置瀏覽器默認打開的時候所採用的字符編碼
//          設置瀏覽器默認打開的時候採用的字節編碼
//          response.setHeader("Content-type", "text/html;charset=UTF-8");

//          設置response的字符流的緩衝區的編碼
//          response.setCharacterEncoding("UTF-8");


            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().println("燦老師蒼老師,我來了");
        }

5.Request(完成一個註冊的功能):

5.1Request的概述

Request代表用戶的請求。
【Request的API】
*【功能一】:獲得客戶機相關的信息
獲得請求的方式:String — getMethod()
獲得請求的路徑: String — getRequestURI()、、、StringBuffer — getRequestURI();
獲得客戶機相關的信息:String — getRemoteAddr()
獲得工程名:String — getContextPath();
*【功能二】:獲得從頁面提交的參數
String — getParameter()
Map — getParameterMap()
Enumeartion — getParameterNames()
String — getParameterValues(String name);
*【功能三】作爲域對象存儲數據
removeAttribute(String name)
setAttribute(String name,Object o)
getAttribute(String name)

public class RegisterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        try {
            request.setCharacterEncoding("UTF-8");

//          1.接受參數
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String email = request.getParameter("email");
            String name = request.getParameter("name");
            String sex = request.getParameter("sex");
            String telephone = request.getParameter("telephone");

//          2.封裝數據

            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            user.setEmail(email);
            user.setName(name);
            user.setSex(sex);
            user.setTelephone(telephone);

//          3.調用業務層處理數據
            UserService userService = new UserService();
            userService.register(user);

//      4.  頁面的跳轉
            response.sendRedirect(request.getContextPath()+"/demo3login/login.html");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

5.2Request中問亂碼的問題

現在無論是GET還是POST提交中文的時候,都會出現亂碼的問題。

POST解決方案:
*1.POST參數在請求體中,直接到達後臺的Servlet,數據封裝到Servlet中的request中,request也有一個緩衝區,request的緩衝區也是ISO-8859-1編碼。
*2.設置緩衝區的編碼:request.setCharacterEncoding(“UTF-8”); —一定要在接受參數之前設置編碼。
GET的解決方案
*1.修改tomcat的字符集編碼,(不推薦)。
*2.使用URLEncoder和URLDecoder進行編碼和解碼的操作。
*3.使用String的構造方法(推薦)。String(byte[] byte,String CharsetName);

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

//      String name = request.getParameter("name");
//      String ssName = new String(name.getBytes("ISO-8859-1"), "UTF-8");

        String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
        System.out.println("get method"+name);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//      doGet(request, response);
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");
        System.out.println("get method"+name);
    }

5.3Request域對象的作用範圍

使用Request對象存取數據
*setAttribute(String name,String Value)。
*Object getAttribute(String name)

request作用範圍:
*1.作用範圍就是一次請求的範圍。
*2.創建和銷燬:
*2.1創建:客戶端向服務器發送了一次請求以後,服務器就會創建一個request對象。
*2.2銷燬:當服務器對這次請求做出響應之後。

5.4重定向和轉發的區別:(redirect和forward的區別)

*1.重定向的地址欄會發生變化;轉發的地址欄不會變化。
*2.重定向兩次請求兩次響應;轉發一次請求一次響應。
*3.重定向路徑需要加工程名;轉發的路徑不需要加工程名。
*4.重定向可以跳轉到任意網站;轉發只能在服務器內部跳轉。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      重定向
        request.setAttribute("name", "XXX");  ---重定向情況下,顯示NUll,因爲重定向是兩次請求。
        response.sendRedirect("/WebExercise/ForwardServlet2");

//      轉發
//      request.setAttribute("name", "XXX");   --- 轉發情況下,顯示XXX。
//      request.getRequestDispatcher("/ForwardServlet2").forward(request, response);

    }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String name = (String) request.getAttribute("name");
        response.setContentType("text/html;charset=UTF-8"); 
        response.getWriter().println("servlet2 .... forward"+"\t+"+name);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章