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

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


例:4.4.2

chinesePicture.jsp:

<%@ page contentType="text/html; charset=GBK"%>
正常的中文圖片應該顯示不了    <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;// 文件結尾
            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");
    }
}

運行輸出結果: