1. 程式人生 > >Java 處理中文名稱檔案下載的處理、驗證碼生成

Java 處理中文名稱檔案下載的處理、驗證碼生成

建立DownLoadServlet,備份使用

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class DownLoadServlet2 extends HttpServlet {

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

        //*******檔名稱是中文的下載*******


        //獲得要下載的檔案的名稱
        String filename = request.getParameter("filename");//????.jpg
        //解決獲得中文引數的亂碼----下節課講
        filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg


        //獲得請求頭中的User-Agent
        String agent = request.getHeader("User-Agent");
        //根據不同瀏覽器進行不同的編碼
        String filenameEncoder = "";
        if (agent.contains("MSIE")) {
            // IE瀏覽器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
            filenameEncoder = filenameEncoder.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐瀏覽器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filenameEncoder = "=?utf-8?B?"
                    + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它瀏覽器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");             
        }



        //要下載的這個檔案的型別-----客戶端通過檔案的MIME型別去區分型別
        response.setContentType(this.getServletContext().getMimeType(filename));
        //告訴客戶端該檔案不是直接解析 而是以附件形式開啟(下載)----filename="+filename 客戶端預設對名字進行解碼
        response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);

        //獲取檔案的絕對路徑
        String path = this.getServletContext().getRealPath("download/"+filename);
        //獲得該檔案的輸入流
        InputStream in = new FileInputStream(path);
        //獲得輸出流---通過response獲得的輸出流 用於向客戶端寫內容
        ServletOutputStream out = response.getOutputStream();
        //檔案拷貝的模板程式碼
        int len = 0;
        byte[] buffer = new byte[1024];
        while((len=in.read(buffer))>0){
            out.write(buffer, 0, len);
        }

        in.close();
        //out.close();

    }

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

————————————–分割線—————————————-

生成程式碼CheckImgServlet

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 驗證碼生成程式
 * 
 * 
 * 
 */
public class CheckImgServlet extends HttpServlet {

    // 集合中儲存所有成語
    private List<String> words = new ArrayList<String>();

    @Override
    public void init() throws ServletException {
        // 初始化階段,讀取new_words.txt
        // web工程中讀取 檔案,必須使用絕對磁碟路徑
        String path = getServletContext().getRealPath("/WEB-INF/new_words.txt");
        try {
            BufferedReader reader = new BufferedReader(new FileReader(path));
            String line;
            while ((line = reader.readLine()) != null) {
                words.add(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 禁止快取
        // response.setHeader("Cache-Control", "no-cache");
        // response.setHeader("Pragma", "no-cache");
        // response.setDateHeader("Expires", -1);

        int width = 120;
        int height = 30;

        // 步驟一 繪製一張記憶體中圖片
        BufferedImage bufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);

        // 步驟二 圖片繪製背景顏色 ---通過繪圖物件
        Graphics graphics = bufferedImage.getGraphics();// 得到畫圖物件 --- 畫筆
        // 繪製任何圖形之前 都必須指定一個顏色
        graphics.setColor(getRandColor(200, 250));
        graphics.fillRect(0, 0, width, height);

        // 步驟三 繪製邊框
        graphics.setColor(Color.WHITE);
        graphics.drawRect(0, 0, width - 1, height - 1);

        // 步驟四 四個隨機數字
        Graphics2D graphics2d = (Graphics2D) graphics;
        // 設定輸出字型
        graphics2d.setFont(new Font("宋體", Font.BOLD, 18));

        Random random = new Random();// 生成隨機數
        int index = random.nextInt(words.size());
        String word = words.get(index);// 獲得成語

        // 定義x座標
        int x = 10;
        for (int i = 0; i < word.length(); i++) {
            // 隨機顏色
            graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
                    .nextInt(110), 20 + random.nextInt(110)));
            // 旋轉 -30 --- 30度
            int jiaodu = random.nextInt(60) - 30;
            // 換算弧度
            double theta = jiaodu * Math.PI / 180;

            // 獲得字母數字
            char c = word.charAt(i);

            // 將c 輸出到圖片
            graphics2d.rotate(theta, x, 20);
            graphics2d.drawString(String.valueOf(c), x, 20);
            graphics2d.rotate(-theta, x, 20);
            x += 30;
        }

        // 將驗證碼內容儲存session
        request.getSession().setAttribute("checkcode_session", word);

        // 步驟五 繪製干擾線
        graphics.setColor(getRandColor(160, 200));
        int x1;
        int x2;
        int y1;
        int y2;
        for (int i = 0; i < 30; i++) {
            x1 = random.nextInt(width);
            x2 = random.nextInt(12);
            y1 = random.nextInt(height);
            y2 = random.nextInt(12);
            graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
        }

        // 將上面圖片輸出到瀏覽器 ImageIO
        graphics.dispose();// 釋放資源

        //將圖片寫到response.getOutputStream()中
        ImageIO.write(bufferedImage, "jpg", response.getOutputStream());

    }

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

    /**
     * 取其某一範圍的color
     * 
     * @param fc
     *            int 範圍引數1
     * @param bc
     *            int 範圍引數2
     * @return Color
     */
    private Color getRandColor(int fc, int bc) {
        // 取其隨機顏色
        Random random = new Random();
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

}

準備的驗證碼上的文字new_words.txt

一唱一和
一呼百應
一乾二淨
一舉兩得
一落千丈
一模一樣
一暴十寒
一日千里
一五一十
一心一意
兩面三刀
三長兩短
三番五次
三三兩兩
三頭六臂
三心二意
三言兩語
四分五裂
四面八方
四通八達
四平八穩
五光十色
五湖四海
五花八門
五顏六色
六神無主
七顛八倒
七零八落
七拼八湊
七上八下
七手八腳
七嘴八舌
八面玲瓏
九死一生
十全十美
百發百中
百孔千瘡
百戰百勝
百依百順
千變萬化
千差萬別
千軍萬馬
千山萬水
千絲萬縷
千辛萬苦
千言萬語
千真萬確
千錘百煉
千方百計
千奇百怪
千姿百態
千鈞一髮
千慮一得
千慮一失
千篇一律
萬水千山
萬無一失
萬眾一心
萬紫千紅
萬死一生
推心置腹
肝膽相照
情同手足
志同道合
風雨同舟
榮辱與共
同甘共苦
關懷備註
心心相印
海誓山盟
拔刀相助
親密無間
萬紫千紅
春暖花開
鳥語花香
奼紫嫣紅
花紅柳綠
百花爭豔
錦上添花
火樹銀花
昨日黃花
春花秋月
過時黃花
花團錦簇
花枝招展
崇山峻嶺
山明水秀
山窮水盡
大好山河
刀山火海
地動山搖
高山深澗
懸崖峭壁
峰巒雄偉
漫山遍野
江山如畫
錦繡山河
五彩繽紛
五顏六色
一碧千里
萬紫千紅
花紅柳綠
翠色慾流
奼紫嫣紅
五光十色
青紅皁白
綠水青山
不可多得
鳳毛麟角
九牛一毛
絕無僅有
空前絕後
寥寥無幾
寥若晨星
寧缺毋濫
前所未有
屈指可數
三三兩兩
鐵樹開花
微乎其微
一麟半爪
一絲一毫
百裡挑一
滄海一粟
千古絕唱
摩肩接踵
車水馬龍
川流不息
紛至沓來
花花世界
舉袖為雲
揮汗如雨
絡繹不絕
門庭若市
萬人空巷
水洩不通
人聲鼎沸
人歡馬叫
人山人海
震耳欲聾
座無虛席
包羅永珍
琳琅滿目
美不勝收
目不暇接
無奇不有
無窮無盡
無所不包
五花八門
眼花繚亂
洋洋大觀
一應俱全
應有盡有
應接不暇
比比皆是
不可計數
層出不窮
綽綽有餘
多多益善
多如牛毛
俯拾皆市
舉不勝舉
漫山遍野
星羅棋佈
豐富多彩
九霄雲外
騰雲駕霧
壯志凌雲
風雲變幻
風起雲湧
行雲流水
風捲殘雲
浮雲蔽日
孤雲野鶴
烘雲托月
過眼雲煙
煙消雲散
大雨傾盆
血雨腥風
風雨交加
風調雨順
槍林彈雨
風雨同舟
風雨無阻
和風細雨
狂風暴雨
滿城風雨
滂沱大雨
春風化雨
風雨飄搖
斜風細雨
未雨綢繆
水流湍急
水平如鏡
高山流水
千山萬水
水滴石穿
水乳交融
滴水不漏
杯水車薪
洪水猛獸
流水無情
直言不諱
無所顧忌
拐彎抹角
真心誠意
故弄玄虛
侃侃而談
滔滔不絕
虛情假意
推心置腹
旁敲側擊
喋喋不休
慢條斯理
含糊其詞
嘮嘮叨叨
振振有辭
肆無忌憚
大言不慚
娓娓動聽
繪聲繪色
對答如流
自圓其說
閒言碎語
閉月羞花
沉魚落雁
出水芙蓉
明眸皓齒
美如冠玉
傾國傾城
國色天香
鶴髮童顏
眉清目秀
和藹可親
心慈面善
張牙舞爪
愁眉苦臉
冰清玉潔
雍容華貴
文質彬彬
威風凜凜
老態龍鍾
虎背熊腰
如花似玉
容光煥發
落落大方
骨瘦如柴
大腹便便
面黃肌瘦
其貌不揚
蓬頭垢面
弱不禁風
口若懸河
對答如流
滔滔不絕
談笑風生
高談闊論
豪言壯語
誇誇其談
花言巧語
忐忑不安
心驚肉跳
心神不定
心猿意馬
心慌意亂
七上八下
心急如焚
班門弄斧
孤芳自賞
居功自傲
目中無人
妄自尊大
忘乎所以
惟我獨尊
自高自大
自鳴得意
自我陶醉
自命不凡
目空一切
不驕不躁
功成不居
戒驕戒躁
洗耳恭聽
虛懷若谷
慎言謹行
學無止境
學而不厭
真才實學
學而不倦
發奮圖強
廢寢忘食
爭分奪秒
孜孜不倦
笨鳥先飛
聞雞起舞
自強不息
只爭朝夕
不甘示弱
全力以赴
力爭上游
披荊斬棘
奮不顧身
捨己為人
堅強不屈
赤膽忠心
不屈不撓
忠貞不渝
誓死不二
威武不屈
捨死忘生
肝膽相照
克己奉公
一絲不苟
兩袖清風
見禮忘義
永垂不朽
頂天立地
豁達大度
兢兢業業
賣國求榮
恬不知恥
貪生怕死
厚顏無恥
神采奕奕
眉飛色舞
昂首挺胸
驚慌失措
漫不經心
垂頭喪氣
沒精打采
愁眉苦臉
大驚失色
炯炯有神
怒髮衝冠
一目十行
一日千里
一字千金
百發百中
一日三秋
不毛之地
不計其數
膽大包天
寸步難行
一步登天
千鈞一髮
觀者如雲
揮金如土
鐵證如山
愛財如命
穩如泰山
門庭若市
骨瘦如柴
冷若冰霜
如雷貫耳
守口如瓶
浩如煙海
高手如林
陽春三月
春光明媚
春回大地
春暖花開
春意盎然
春意正濃
風和日麗
春花爛漫
鳥語花香
百鳥鳴春
百花齊放
鶯歌燕舞
赤日炎炎
烈日炎炎
驕陽似火
揮汗如雨
大汗淋漓
鳥語蟬鳴
萬木蔥蘢
枝繁葉茂
蓮葉滿池
秋高氣爽
天高雲淡
秋風送爽
秋菊怒放
秋菊傲骨
秋色迷人
秋色宜人
金桂飄香
果實累累
北雁南飛
滿山紅葉
五穀豐登
蘆花飄揚
天寒地凍
北風呼嘯
滴水成冰
寒冬臘月
瑞雪紛飛
冰天雪地
冰封雪蓋
漫天飛雪
白雪皚皚
冰封大地
冰天雪地
東方欲曉
旭日東昇
萬物初醒
空氣清醒
雄雞報曉
晨霧瀰漫
晨光絢麗
烈日當頭
麗日臨空
豔陽高照
萬里無雲
碧空如洗
日落西山
夕陽西斜
殘陽如血
炊煙四起
百鳥歸林
華燈初上
夜幕低垂
日薄西山
夜深人靜
月明星稀
夜色柔美
夜色迷人
深更半夜
漫漫長夜
風光秀麗
人山人海
車水馬龍
寧靜和諧
草木蒼翠
竹籬瓦舍
山幽路闢
小橋流水
直指青雲
古色古香
青磚素瓦
聳入碧雲
機器轟鳴
鐵流直瀉
熱氣騰騰
鋼花飛濺
粉飾一新
門可羅雀
冷冷清清
錯落有致
富麗堂皇
設施齊全
氣勢雄偉
金碧輝煌
風景如畫
聞名遐邇
井然有序
雜亂無章
佈局巧妙
錯落有致
寬闊平坦
崎嶇不平
擁擠不堪
暢通無阻
花紅柳綠
花色迷人
花香醉人
花枝招展
百花齊放
百花盛開
百花爭豔
絢麗多彩
五彩繽紛
奼紫嫣紅
綠草如茵
一碧千里
雜草叢生
生機勃勃
蒼翠挺拔
鬱鬱蔥蔥
枯木逢春
秀麗多姿
青翠欲滴
林海雪原
聳入雲天
瓜果蔬菜
清香鮮嫩
青翠欲滴
果園飄香
果實累累
果實飽滿
鮮嫩水靈
象徵和平
乳燕初飛
婉轉悅耳
鶯歌燕舞
翩然歸來
枝頭嬉戲
灰不溜秋
嘰嘰喳喳
鸚鵡學舌
婉轉悅耳
笨嘴學舌
利嘴如鐵
鋼爪如釘
神氣活現
昂首挺胸
肥大豐滿
自由自在
引吭高歌
騰空而起
狂奔飛馳
膘肥體壯
昂首嘶鳴
瘦骨嶙峋
行動遲緩
俯首帖耳
膘肥體壯
川流不息
呼嘯而過
穿梭往來
緩緩駛離
一葉扁舟
揚帆遠航
乘風破浪
霧海夜航
追波逐浪
劃破雲層
直衝雲霄
穿雲而過
銀鷹展翅
學習用品
美觀實用
小巧玲瓏
造型優美
設計獨特
栩栩如生
活潑可愛
惹人喜愛
愛不釋手
雨後彩虹
彩橋橫空
若隱若現
光芒萬丈
大雪紛飛
大雪封山
鵝毛大雪
漫天飛雪
瑞雪紛飛
林海雪原
風雪交加
雪上加霜
寒霜襲人
霜林盡染
垂露欲滴
朝露晶瑩
日出露幹
電光石火
雷電大作
驚天動地
春雷滾滾
電劈石擊
雷電交加
陰雨連綿
牛毛細雨
秋雨連綿
隨風飄灑
傾盆大雨
狂風暴雨
大雨滂沱
瓢潑大雨
大雨淋漓
暴雨如注
秋風送爽
金風送爽
北風呼嘯
微風習習
寒風刺骨
風和日麗
大霧迷途
雲霧茫茫
霧似輕紗
風吹霧散
雲消霧散
彩雲滿天
天高雲淡
烏雲翻滾
彤雲密佈
彩霞繽紛
晚霞如火
朝霞燦爛
丹霞似錦
滿天星斗
眾星捧月
群星燦爛
萬點繁星
月出東牆
月出東山
玉兔東昇
月光皎潔
月色迷人
月牙初升
旭日東昇
日上三竿
一輪紅日
日高三尺
豔陽高照
烈日當頭
驕陽似火
日影西斜
苦口婆心
口若懸河
心平氣和
不慌不忙
語重心長
熱情洋溢
恭恭敬敬
洗耳恭聽
親密無間
形影不離
情同手足
團結友愛
朝夕相處
人山人海
人聲喧譁
人聲嘈雜
人如潮湧
摩肩接踵
傾盆大雨
狂風暴雨
大雨滂沱
瓢潑大雨
讀書學習
神情專注
學而不厭
學無止境
專心致志
日積月累
似懂非懂
普天同慶
彩旗飛舞
歡天喜地
張燈結綵
徹夜狂歡
興高采烈
手舞足蹈
笨手笨腳
擠眉弄眼