圖片名字是中文的解決方案

馬克-to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
當(dāng)我寫(xiě)到本章第七節(jié)(jsp一些其它相關(guān)話(huà)題)的時(shí)候,我有一個(gè)話(huà)題就是解決jsp下面的所有的中文的問(wèn)題。但當(dāng)圖片名字是中文的時(shí)候,怎么都顯示不出來(lái)圖片。上網(wǎng)查了很長(zhǎng)時(shí)間,也都沒(méi)有理想的解決方案。有的說(shuō)改變服務(wù)器的設(shè)置,有的說(shuō)把圖片的中文名字改成數(shù)字名字,之后把相關(guān)的信息存在數(shù)據(jù)庫(kù)當(dāng)中。有一個(gè)人建議用html的img標(biāo)簽指向Servlet。這個(gè)技術(shù)我早就知道,但是用在這里,這個(gè)想法還真是富有啟發(fā)性。不過(guò)在那個(gè)人的例子里,中文圖片名是硬編碼進(jìn)Servlet去的,沒(méi)有實(shí)際的意義。我也就沒(méi)太在意這件事。這次回來(lái)寫(xiě)這部分知識(shí),還真是仔細(xì)想了想。馬克-to-win:底下我這個(gè)例子的思路是:當(dāng)我運(yùn)行html的時(shí)候,這個(gè)html的img能夠調(diào)用servlet,這是大家都知道的技術(shù)。最關(guān)鍵的是 Servlet可以知道是誰(shuí)在調(diào)用它。這個(gè)就用Referer技術(shù)。知道了哪個(gè)html調(diào)用它以后,反過(guò)來(lái)這個(gè)Servlet可以讀出這個(gè)html文件,解析它,找到img標(biāo)簽兒。再找到中文圖片名稱(chēng),Servlet讀出這個(gè)圖片文件,傳送給html,讓它顯示出來(lái)就可以了。


例:4.4.2

chinesePicture.jsp:

<%@ page contentType="text/html; charset=GBK"%>
正常的中文圖片應(yīng)該顯示不了    <img src="我們.jpg" />
<br>然而,下面的方法可以顯示中文圖片:
<img id="code" src="MarkToWinServlet" alt="馬克.jpg"/>



ServletHello1.java:

package com;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) {      
        String referer = request.getHeader("Referer");
        System.out.println(referer);
        int befoPosiRef = referer.lastIndexOf("/")+1;
        String refererFile = referer.substring(befoPosiRef, referer.length());
        System.out.println("refererFile is" + refererFile);
        String ImageFi = null;
        String stdinS = null;
        ServletContext ctx = getServletContext();
        InputStream isjsp = ctx.getResourceAsStream(refererFile);
        BufferedReader stdin = new BufferedReader(new InputStreamReader(isjsp));
        for (int i = 0; i < 13; i++) {
            try {
                stdinS = stdin.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (stdinS == null)
                break;// 文件結(jié)尾
            if (stdinS.indexOf("<img") != -1) {
                if (stdinS.indexOf("alt=\"") != -1) {
                    int befoPosi = stdinS.indexOf("alt=\"") + 5;
                    int endPosi = stdinS.lastIndexOf("\"");
                    ImageFi = stdinS.substring(befoPosi, endPosi);
                    System.out.println("ImageFi is" + ImageFi);
                }
            }
            System.out.println(stdinS);
        }
        response.setContentType("image/jpeg");

        /* 圖片在WebModule的根目錄下 */
        InputStream is = ctx.getResourceAsStream(ImageFi);
        try {
            int len = is.available();
            // response.setContentLength(len);
            ServletOutputStream out;
            out = response.getOutputStream();
            byte[] in = new byte[4096];
            int i = 0;
            while ((i = is.read(in)) != -1) {
                out.write(in, 0, i);
            }
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("finish");
    }
}

運(yùn)行輸出結(jié)果: