簡單案例:文件下載和驗證碼程序

文件下載需求:


    1. 頁面顯示超鏈接
    2. 點擊超鏈接後彈出下載提示框
    3. 完成圖片文件下載

1.新建一個JAVA EE項目,配置tomcat相關設置。新建一個download.html,就是客戶端訪問的界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--文件下載需求:
	1. 頁面顯示超鏈接
	2. 點擊超鏈接後彈出下載提示框
	3. 完成圖片文件下載
	<a href="/Download/img/1.jpg">圖片1</a>
-->
<body>
    <a href="/Download/downloadServlet?filename=1.jpg">圖片1</a>
    <a href="/Download/downloadServlet?filename=九尾.jpg">圖片2</a>

</body>
</html>

這裏註釋中的<a href="/Download/img/1.jpg">圖片1</a>這個超鏈接,瀏覽器會直接將1.jpg給解析到瀏覽器中,就不會出現附件保存形式,所以我們這裏需要創建一個新的servlet來以附件保存的形式來保存圖片。

2.新建一個downloadServlet,實現以附件形式保存圖片的功能。分位以下幾步:

1.通過getParameter方法來獲取文件名稱(圖片文件)

2.要把這個文件通過字節輸入流加入到內存,但是出現問題,必須要找到文件所在的真實路徑。所以這裏通過一系列操作獲得到真實路徑。然後把這個文件通過字節輸入流加入到內存

3.設置response響應頭 主要是需要設置兩個,一個是響應頭類型:content-type,另一個是響應頭打開類型(附件):content-disposition

4.將輸入流數據寫到輸出流(下載)

tips:後續通過工具包,解決如果圖片是中文名字的亂碼問題。

package Download;

import utils.DownLoadUtils;

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. 獲取文件名稱
			2. 使用字節輸入流加載文件進內存
			3. 指定response的響應頭: content-disposition:attachment;filename=xxx
			4. 將數據寫出到response輸出流
         */
        String filename = request.getParameter("filename");//根據參數名稱獲取參數值
        //如何理解getServletContext()方法:
        //一個servlet可以使用getservletcontext()方法得到了web應用中的servletcontext,從而使用servletcontext接口的一些方法
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/" + filename);//獲取文件的真實(服務器)路徑
        FileInputStream fis = new FileInputStream(realPath);//用字節流關聯
        //設置response響應頭 主要是需要設置兩個,一個是響應頭類型:content-type,另一個是響應頭打開類型(附件):content-disposition
        String mimeType = servletContext.getMimeType(filename);
        response.setHeader("content-type",mimeType);
        //*************************
        //解決中文命名的文件名亂碼問題
        //1.獲取請求頭user-agent
        String agent = request.getHeader("user-agent");
        //2.使用我們下載的工具類方法去編碼文件名
        filename = DownLoadUtils.getFileName(agent,filename);
        response.setHeader("content-disposition","attachment;filename = "+filename);
        //將輸入流數據寫到輸出流
        int len = 0;
        byte[] buff = new byte[1024*8];
        ServletOutputStream sos = response.getOutputStream();
        while ((len = fis.read(buff)) != -1){//等於-1相當於讀完了
            sos.write(buff,0,len);
        }
        fis.close();//輸入流關掉,這裏輸出流在服務器不需要關了
    }

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

貼一下工具包:網上很多,其實就是一個編碼和解碼的過程。

package utils;

//import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


public class DownLoadUtils {

    public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
        if (agent.contains("MSIE")) {
            // IE瀏覽器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");

//        } else if (agent.contains("Firefox")) {
//            // 火狐瀏覽器
//            BASE64Encoder base64Encoder = new BASE64Encoder();
//            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它瀏覽器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}

驗證碼程序(servlet):

package Download;

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);

        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";
        //生成隨機角標
        Random ran = new Random();
        for (int i = 1; i <= 4; i++) {//生成4個驗證碼
            int index = ran.nextInt(str.length());
            //獲取字符
            char ch = str.charAt(index);//隨機字符
            //2.3寫驗證碼
            g.drawString(ch+"",width/5*i,height/2);
        }
        //2.4畫干擾線
        g.setColor(Color.GREEN);
        //隨機生成座標點
        for (int i = 0; i < 10; i++) {
            int x1 = ran.nextInt(width);
            int x2 = ran.nextInt(width);
            int y1 = ran.nextInt(height);
            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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章