这里其实涉及到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