Jsp中图片显示问题
最近项目中,有图片上传的情况,要求:保存路径存储在配置文件中,放在系统绝对路径下,命名方式:path/image/分类/imageName。
过程中,分类目录使用的是中文路径,一直没有想到因为中文路径会导致图片不显示,在查看图片时,一直都显示404,找不到资源,但是明显路径没有问题,图片也确实存在,害的本人头疼好久,突然发现显示图片的路径中,中文被编码成一串字符,难道是因为路径包涵中文?在线搜索,发现确实有这种情况,所以试了一下,结果成功显示。
解决方法:
在tomcat中设置中文路径:tomcat中server.xml文件中的connector部分:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
在其中添加一个属性:URIEncoding=”utf-8”。此处编码和网页编码相同。如:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
可以显示图片。究其原因,在html,jsp页面中,引用了带汉字的图片或者目录,形如这样,如果没有在tomcat配置URIEncoding属性,则无法显示。
Jsp中显示绝对路径图片
1.使用servlet存储图片,将servlet当做img的src来显示。如下:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
response.setContentType("image/jpeg"); //设置图片格式格式,这里可以忽略
FileInputStream fis = null;
OutputStream os = null;
try {
fis = new FileInputStream(imagePath);//图片路径
os = response.getOutputStream();
int count = 0;
byte[] buffer = new byte[1024*1024];
while ( (count = fis.read(buffer)) != -1 )
os.write(buffer, 0, count);
} catch (IOException e){
e.printStackTrace();
}finally {
try {
if (os != null) {
os.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是servlet的方法,然后在jsp页面的img标签的src设置为访问该servlet即可。
2.另一种方式,在使用springmvc这样的框架时,如果我要添加一个servlet,个人觉得没有什么必要,那么就在jsp页面中的img的src中设置访问路径,如下:
<img name="imgdis" alt="图片显示" src="${ctx }//showImage?id=${image.id}">
此时在请求url对应方法中添加类似servlet中的doPost方法相应方法即可。例如:
public void showImage(HttpServletResponse response, String imagePath) {
response.setContentType("text/html; charset=UTF-8");
// response.setContentType("image/jpeg"); // 设置图片格式格式,这里可以忽略
FileInputStream fis = null;
OutputStream os = null;
try {
fis = new FileInputStream(imagePath);
os = response.getOutputStream();
int count = 0;
byte[] buffer = new byte[1024 * 1024];
while ((count = fis.read(buffer)) != -1)
os.write(buffer, 0, count);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这样绝对路径的图片就可以被显示了。