resin系统,在URL中最后的文件名是汉字时,链接总是出错,哪位大侠遇到过这样的问题?

gotogod 2002-03-03 05:00:01
是这样的,我的系统中要让用户上传文件,然后再建立链接,供需要时下载,比如说:
<a href="http://localhost:8080/mail_at/fff/中文文件.jpg">中文文件.jpg</a>

但总是报错,而英文文件就无此问题。对于网上诸如加<%@ page contentType="text/html;charset=gb2312" %> 或者编码的方法我都试过了,不行。我还用过这种方法:
String aN = java.net.URLEncoder.encode("中文文件");
结果也不行!!

哪位高人有办法,帮俺一把啊?

出错信息:

404 Not Found
/mail_at/fff/%E6%97%A0%E6%A0%87%E9%A2%98.jpg was not found on this server.
...全文
275 点赞 收藏 18
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gotogod 2002-03-21
还有,xagang(乱码)的方法我有些看不懂
这好象只解决了传递参数是中文的问题,这个问题在resin中是已解决了的

补充
tomcat中是这样做的:
<%
String gbname = java.net.URLEncoder.encode("中文文件.jpg");
String myurl = mydir + "/" + gbname;
%>
<a href="<%=myurl%>">中文文件.jpg</a>
回复
gotogod 2002-03-21
不对啊,如果是tomcat就可以——起码可以找到中文名称的文件
但下载时文件名会变成乱码(这大概才是hax(海曦) 老兄上面分析的问题)
而resin就干脆找不到文件

当然不用中文作文件名最好,但我遇到的情况是将大家上传的文件再提供下载,这样我不能要求大家上传文件只能用英文名啊

再等一会,实在没有办法就结贴吧
先谢谢hax(海曦)老兄,起码我了解了一些详细的东西:)
回复
hax 2002-03-21
BTW,resin的中文支持其实是不错的。它可以直接得到中文参数,不需要Justin和truezerg的代码来做显式转换。因为它完全的实现了servlet 2.3/jsp 1.2,可以通过request.getCharacterEncoding得到请求所包含参数的编码,也可以用request.setCharacterEncoding来强制设置编码。

当然如果用其他jsp引擎有中文问题的,用xagang(乱码)的方法也是一个简单的变通方法。

回复
hax 2002-03-21
这不一定是(应该不是)resin的问题。
不知道你的web server用的是什么? iis、apache还是resin自带的httpd?

即使你用Window 2000 Server中文版所带iis建立的网站,用中文文件名也可能无法下载。而且这跟客户端的IE也有很大的关系!!比如ie的“始终用utf-8发送url”的选项。opera 6也无法访问中文文件名。

其实最主要的原因是url规格最初制订时候就没有考虑到中文的复杂编码问题。因此这个问题跟浏览器和server处理中文url的方法都密切相关。

根据url的一般定义,只用到字母和数字。其他特殊字符都被解释成%XX的形式。XX是该字符的ASCII码(十六进制)比如空格就变成了%20。而中文就更超级复杂!!!

因为基本上我们都用gb2312的编码,它是一种基于ASCII扩展的混长编码。普通的英文字母还是跟US-ASCII编码一样,中文则用两个超过127的ASCII字符合成。因此通常我们可以认为它是ANSI兼容的。在Window下,中文和ANSI的本地代码页同是936。于是一种发送url的方式就是简单的把一个中文当作两个ASCII字符来处理。

但是还有另外一种方法,就是把gb2312编码的中文转成utf-8再发送!这种转码当然是把一个中文字就当作真的一个字符来处理!就是unicode的字符!unicode中所有字符的地位都是一样的,无论是一个英文字母还是中文字还是蝌蚪文!utf-8是把unicode编码变成若干个ASCII码表示,中文一般会变成3个字节。因此如果你用ultraedit打开用utf-8编码保存的中文文件,将看到乱码。然后如果是url,则这3个字节再根据前面讲的url编码规则再进行编码!
由此中文在第一种情况下将变成%XX%XX,而第二种情况就变成%XX%XX%XX!
显然这两者不会相同!

如果客户端也就是浏览器处理url的方式跟服务器处理的方式不一致,那么你当然就不能下载了!即使一致,也可能由于转码后解码过程的bug(外国人的程序处理复杂的中文编码能不出bug吗?我说得都头昏,不要说做了)导致包含某些特定中文字组合的文件无法访问。

所以,说了那么多废话,其实一句话:不要用中文字做文件名就好了。实在需要的地方用拼音替代吧!
回复
gotogod 2002-03-19
呵呵,我试着再说清楚一点
上传文件用中文名,保存到服务器端绝对正常
但其实我的问题和上传没有关系,我的问题是,当一个存在服务器虚拟目录下的中文文件名的文件,需要给用户下载时,我应该建立一个超级链接指向该文件如:
<a href="/mywebdir/docdir/申请报告.doc">申请报告.doc</a>
显示在客户端是正确的,但当用户点击下载时,就会出现问题了!!!
但是如果是英文名,则一切正常

综合大家的看法,这是resin不支持中文目录的原因,不知道有没有好的办法可以解决。我去下了个resin的最新版本(2.05),但问题依旧,真是无奈:)
回复
hax 2002-03-19
大家不要还没搞清楚状况就急着给各种方法,他的问题其实没有表达清楚。

到底问题出在哪一步,gotogod你最好讲得更清楚一些。
比如上传文件文件名用中文,保存到服务器端是否正常?
又如你在服务器端放个文件用中文起名字,看看能否用http访问?

搞清楚问题出在哪一步再求助大家。否则只是越帮越忙。
回复
nevergrief 2002-03-19
truezerg(赵明宇) :你的方法不行!
回复
gotogod 2002-03-17
问题远未解决!!
我不知道该不该给分啊?
回复
乱码 2002-03-14
java.net.URLEncoder.encode("中文文件")
找的就是他!
回复
gzwrj 2002-03-08
用form试试..
<form name='' method="post" action="">
<type=hidden name="wwwww" value="<%=java.net.URLEncoder.encode("中文文件")%>"
</form>
回复
乱码 2002-03-06
这是msdn中关于javascript API 方法escape()的说明
在JSP中也写一个类似的方法对链接有关的字符串进行编码就ok了
举例:<a href="/showMe.jsp?id=<%= jspEscape("轻舞飞扬") %>">

////////////////////////////////////////////////////////////////////
escape 方法
请参阅
encodeURI 方法 | encodeURIComponent 方法 | String 对象 | unescape 方法

应用于: Global 对象
要求
版本 1
对 String 对象编码以便它们能在所有计算机上可读,

escape(charString)
必选项 charstring 参数是要编码的任意 String 对象或文字。

说明
escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 "%20" 。

字符值大于 255 的以 %uxxxx 格式存储。

注意 escape 方法不能够用来对统一资源标示码 (URI) 进行编码。对其编码应使用 encodeURI 和encodeURIComponent 方法。
要求
版本 1

请参阅
encodeURI 方法 | encodeURIComponent 方法 | String 对象 | unescape 方法

应用于: Global 对象

回复
truezerg 2002-03-05
我有办法如下:
<%
String myurl=="http://localhost:8080/mail_at/fff/中文文件.jpg"
String tmp=new String(myurl.getBytes("gb2312"),"iso8851-1") %>
<a href=<%=tmp%>>中文文件.jpg</a>

这种方法也适用也用 response.sendircet()重定为URL的中文问题



回复
Justin 2002-03-05
看看这篇文章对你用用没有?

-----------------------------------------------------
为了方便移植,是发用标准的SQL语句,否则与JDBC初衷相背
汉字处理上,既要指定HTML编码,还要指定response的contenttype,另外在存库之前和读库之后应分别可调用一个处理函数,处理函数可以返回原串,或对它进行编码,总之有机会编码就是了。另外如果要修改,只修改一个方法就可以了。预留空函数是编程的一种方法,特别是对JAVA中处理汉字有乱码这种常见问题。

另外,在getparameter之后,也可和读库相似的处理

虽然编码方法没有定法,但为了简单起见,也不宜写成接口,而是直接写成一个类的 静态方法,以下是读到串后的处理示例

String boid = db.DbConnection.bytes2gb(request.getParameter("boid"))

String boardsname = db.DbConnection.bytes2gb(rs.getString("boardsname"))

...
/**
#@ add by zzl at 2002.03.02
#@ (DbConnection.java)
package db;
*/
public static String bytes2gb(String gb)
{
String s =null;
if(gb!=null)
{
try{
s = new String(gb.getBytes("ISO8859_1"),"GB2312");
}catch(Exception e){
System.out.println(e.toString());
e.printStackTrace();
}
}
return s;
}
回复
xexplorer 2002-03-05
应该是中文编码的问题,你取得的内容编码不对是乱码,你是是转化一下编码吧。
回复
yanchang 2002-03-04
你用手工在ie 的地址里输入文件名能出来吗?

用e 文的吧
回复
yanchang 2002-03-04
好象没办法了
除非你重新修改一下他的原码

你用手工在ie地址里输入可以出来吗

换e文的吧
回复
leonzhao 2002-03-04
我的建议是上载的文件全部都自己管理起来,不要用原名!
回复
gotogod 2002-03-04
手工也一样!

没有办法了吗?
回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告