1. 程式人生 > 其它 >JavaWeb 檔案下載案例 (response)

JavaWeb 檔案下載案例 (response)

技術標籤:Java入門servletjavajavaee

學習資歷:黑馬JAVA2019版

自制簡易驗證碼邏輯:

package cn.web.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.
http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; @WebServlet("/checkCodeServlet") public class CheckCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { int width = 100; int height = 50; //1建立一個物件,在記憶體中是圖片(驗證碼圖片物件) BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //2.美化圖片 //2.1填充背景色 Graphics g = image.getGraphics(); //畫筆物件 g.
setColor(Color.PINK); g.fillRect(0,0,width,height); //2.2畫邊框 g.setColor(Color.blue); g.drawRect(0,0,width-1,height-1); //2.3 寫驗證碼 String str = "QWERTYUIOPASDFGHJKLZXCVBNM0123456789"; //生成隨機腳標 Random ran = new Random(); for(int i = 1;i <= 4;i++) { int index = ran.nextInt(str.length()); //獲取字元 char ch = str.charAt(index); g.drawString(ch+"",width / 5 *i,height/2); } //2.4 劃干擾線 g.setColor(Color.green); for(int i = 0;i < 7;i++) { int x1 = ran.nextInt(width); int y1 = ran.nextInt(height); int x2 = ran.nextInt(width); int y2 = ran.nextInt(height); g.drawLine(x1,y1,x2,y2); } //3.將圖片輸出到頁面上 ImageIO.write(image,"jpg",response.getOutputStream()); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }

下載servlet:
注意兩點:
1.html中的超鏈填寫servlet的虛擬路徑
2.html中超鏈引數不能有空格

package cn.web.download;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

@WebServlet("/downLoadServlet")
public class DownLoadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.獲取請求引數,檔名稱
        String filename = request.getParameter("filename");


        //2.使用位元組輸入流載入檔案進記憶體
        //2.1找到檔案伺服器路徑
        ServletContext servletContext = this.getServletContext();
        String realpath = servletContext.getRealPath("/img/"+filename); //初始路徑在web處
        //2.2用位元組輸入流關聯(生成輸入流)
        FileInputStream fis = new FileInputStream(realpath);


        //3.設定response響應頭
        //3.1設定響應頭型別,context-type 告訴瀏覽器檔案型別
        String mimeType = servletContext.getMimeType(filename);
        response.setHeader("content-type",mimeType);

        //3.2設定響應頭開啟方式:content-disposition 告訴瀏覽器開啟方式
        response.setHeader("content-disposition","attachment;filename=" + filename); //以附件形式開啟

        //4.將輸入流的資料寫出到輸出流中
        ServletOutputStream sos = response.getOutputStream();
        byte [] buff = new byte[1024 * 8]; //快取區
        int len = 0;
        while((len = fis.read(buff)) != -1) //讀到buff快取區中,若不等於-1則沒讀完
        {
            sos.write(buff,0,len);
        }
        fis.close();//關閉輸入流

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	//這樣的超鏈點開來是直接開啟的,並且路徑固定,一旦要改非常麻煩
    <a href="/download/488.png">圖片1</a>

    <hr>
    //裡面servlet地址填虛擬路徑
    //注意問號後面filname=xxx不能有空格,不然完全讀不到引數
    <a href="/day15/downLoadServlet?filename=640.png">圖片1</a>
    <a href="/day15/downLoadServlet?filename=ex1.png">圖片2</a>

</body>
</html>