图片路径中含有中文在jsp下不能正常显示的问题

本文详细介绍了如何解决Tomcat服务器在处理中文路径和文件名时遇到的编码问题,包括修改server.xml文件中的URIEncoding属性,以及通过URL编码和过滤器等方式处理中文字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里其实涉及到get请求编码和url编码的问题。
一 当路径中存在中文的时候,最简单的解决办法是改变tomcat的编码:
WEB进行上传中文文件名的文件时没问题,但下载的时候出现问题,经过一番查找之后原来是TOMCAT默认不支持中文路径和中文文件,如果直接从Apache站点中下载Tomcat,无论是安装版的exe文件,还是 解压缩的ZIP文件,内置的对于get协议中的URL编码都是ISO-8859-1,这个字符集不能直接支持中文等双字节的信息,而中文文件的下载链接恰 恰是通过get协议进行的。不过只需要修改其配置文件就行了,
在Server.xml文件中添加一个名为URIEncoding的属性,它用于对HTTP请求中的get方法传过来的URL进行编码。以下说明修 改Tomcat安装目录中的config文件夹中的server.xml文件的方法。

找到tomcat——>conf——>server.xml文件, 在server.xml中类似如下配置:

<Connector port="8080" protocol="HTTP/1.1"     connectionTimeout="20000"     redirectPort="8443" />

这段代码规定了Tomcat监听HTTP请求的端口号等信息,可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让 Tomcat不再以ISO-8859-1的编码处理get请求。更改后的代码如下所示:

<Connector port="8080" protocol="HTTP/1.1"     connectionTimeout="20000"     redirectPort="8443"  URIEncoding="UTF-8" />

这样修改后重启Tomcat,测试成功。

URIEncoding=”UTF-8” 这项,其含义是指定URI的编码为:UTF-8。
在后面加上这一项后问题就可以解决了。
注意
1.如果是eclipse使用的tomcat,要到workspace下面找到server文件夹,修改对应项目config里面的server.xml
2.若修改了tomcat的端口,port就不是8080,而是你修改的值,比如8085

PS.
同事的电脑上并没有设置UTF-8,但直接可以显示中文路径,他用的是tomcat 9

Tomcat5的http Connector所用的URI解码默认用的是 ISO-8859-1,
一般浏览器默认用的发送编码为UTF-8,

在server.xml中类似如下配置:
< Connector port="8080" 
   ……
   URIEncoding="UTF-8" / >

其中URIEncoding=“UTF-8” 这项,其含义是指定URI的编码为:UTF-8。
在后面加上这一项后问题就可以解决了。

另外,有人提出这种方法有隐患
https://www.cnblogs.com/navyhj/p/7143140.html
改变服务器的配置,使服务器支持utf-8来显示图片。这个经过测试是有效的,但是有一点是服务器配置修改了以后,再使用request来获取参数时,中文乱码的问题。通过System.out.print来打印出来的参数是正确的,但是赋值给String对象后却不是正确的值,再通过String对象的getBytes方法来转换以后仍然不正确。所以放弃了这个方法。

参照:

在html页面中,引用了带汉字的图片,形如<img src="/目录/子目录/图片名字.jpg" />,如果没有在tomcat配置URIEncoding,则无法显示。修改方法:

在tomcat的server.xml中加入URIEncoding=“utf-8” (网页的编码是utf-8)

https://bbs.youkuaiyun.com/topics/330109094
13楼的,此方法不可行,主要原因在于那个tomcat下有其他项目在跑,其他项目的Get处理都不是通过Tomcat来直接处理,即设置URIEncoding=utf-8,所以如果现在我设置了这个玩意,那之前的其他项目就会出现二次转码,乱码了。。。

对url编码
做法1
java.net.URLEncoder.encode(url);
注意:url的起始如果非中文如"/test/中文/中国.jsp"
则应该写成"/test/"+java.net.URLEncoder.encode(“中文/中国.jsp”);
意思是只对中文编码,但是"中文/中国.jsp"中的"/"没有问题
<img src=“uploadPath/<%=java.net.URLEncoder.encode(“中文.gif”,“UTF-8”)%>”>

做法2
或者先转好中文的编码,比如

<img src="%E4%B8%AD%E6%96%87.jpg"/>

而不是直接写<img src="中文.jpg"/>

做法3
给中文名用utf-8编码,出来一个带有%号的字符串,对应相应的文件名。当然这还不够,因为这个文件名浏览器会自动转义解码为对应的中文名,图片还是无法显示。于是我用了String对象的replace方法,将文件名的%全部替换为-;然后就可以正确显示图片了。缺点就是查找文件名不易于辨认识别。
String name =“哈哈哈”;
String str = java.net.URLEncoder.encode(name, “utf-8”);
//转义后的为%E5%93%88%E5%93%88%E5%93%88
str = str.replace("%", “-”);
//替换后为-E5-93-88-E5-93-88-E5-93-88
然后文件名再加上相应的扩展名即可。既可以存入数据库也可以直接保存文件名。
三 图片名称改成英文或数字的,原中文名也存入数据库。

显示的时候这样:

<img src='12351235-09.jpg' alt='中文名称' />

或者

<a href='12351235-09.jpg' title='中文名称'>中文名称'</a>

四 另外两种思路
https://bbs.youkuaiyun.com/topics/390728171

上传图片时,发现英文可以,中文则无法显示。
查询Web项目,图片已经上传成功了,查询页面代码,路径也没有错误,但就是显示不出来,不报错,就是不会显示内容。
我后来把图片放到包下,直接【http://localhost/中文图片.jpg】也是无法显示,而如果我将Tomcat 的service.xml文件增加URIEncoding="utf-8"后再输入上面的路径,则可以正常显示。
虽然在Tomcat config下的service.xml加上URIEncoding="utf-8"可以解决这个问题,但由于之前的代码没有设置过这个属性,所以基本上对url的中文参数都做了转码的操作,如设置这个属性的话,会报错。
这个设置基本所有的get请求都会受到影响,因此我想找个只针对图片文件才起到“URIEncoding="utf-8"效果的方法
请问有没只针对某个页面或jpg文件的属性设置,使其达到类似URIEncoding="utf-8"的效果?


这种问题的出现,源于浏览器默认使用的发送编码与服务器的编码不一致导致的。
如果楼主用的是ie浏览器,那么恭喜你。工具–》Internet选项–》高级,把发送utf-8url的勾去掉,点击确定,那么在IE下就可以显示了。
不过你也可以试试在jsp中<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%>

五 改名字
不太建议使用中文命名含有路径的一切资源,如果上传重复名称的文件会造成覆盖【如相同的文件名称新上传的文件覆盖老的文件】。
可以给图片设置一个uuid【或唯一字符串比如当前日期+毫秒数】的名称。

如果用户是上传的文件,可以在上传时修改文件名字并保存下来,如果需要可以把用户上传时的名字保存在数据库中,可以给用户显示上传文件的原名字,这样还能解决用户上传时同名字会覆盖问题!

六 添加一个过滤器
https://bbs.youkuaiyun.com/topics/290057574

https://blog.youkuaiyun.com/lulin27861/article/details/21346407

可以设置filter 并拦截全部的访问,并改变编码集。

Java code

package com.test;
 
import java.io.IOException;
import java.net.URLDecoder;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
public class UrlFilter implements Filter {
 
    public final static String DEFAULT_URI_ENCODE = "UTF-8";
     
    private FilterConfig config = null;
    private String encode = null;
     
    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
        this.encode = config.getInitParameter("DEFAULT_URI_ENCODE");
        if(this.encode == null) {
            this.encode = DEFAULT_URI_ENCODE;
        }
    }
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        String uri = request.getRequestURI();
        String ch = URLDecoder.decode(uri, encode);
        if(uri.equals(ch)) {
            chain.doFilter(req, res);
            return;
        }
        ch = ch.substring(request.getContextPath().length());
        config.getServletContext().getRequestDispatcher(ch).forward(req, res);
    }    
 
    @Override
    public void destroy() {
        config = null;
    }
}

XML/HTML code
在web.xml中增加过滤器:

  <filter>
    <filter-name>urlFilter</filter-name>
    <filter-class>com.test.UrlFilter</filter-class>
    <init-param>
      <param-name>DEFAULT_URI_ENCODE</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>urlFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

如果仅在 PDF 文件存在汉字的话,把过滤器的 url-pattern 改为 *.pdf 就行了,
这样的话上传上去的文件后缀必须改为小写的 .pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值