圖片名字是中文的解決方案
馬克-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é)果: