急!昨天弄了一个下午和晚上没弄出来,中文问题

hyc4132 2003-12-05 08:28:05
JSPSmartUpload上传文件解决中文文件名问题,我的编码是utf-8,上传文件时文件名只要是中文就是乱码,用谁做过着方面的,请求帮助小弟,或者有什么其他的组件能够解决这个问题的,请指点一下,多谢多谢!!
...全文
75 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
crabyan 2003-12-07
  • 打赏
  • 举报
回复
agree dorcom
cucuchen 2003-12-07
  • 打赏
  • 举报
回复
另外请楼主特别注意:在tomcat+j2sdk下面对中文的支持有一种怪现象,如果你在提交页面使用了中文,post到处理页面将有可能会出现乱码!解决的办法如下:
在提交页面最顶上加上request.setCharacterEncoding("GB2312");
另外,我也是用的tomcat+smartupload上传文件,但是它很好的支持中文:根本不需要写什么函数转换.以下是源代码:
上传的例子

1、上传页面upload.html

本页面提供表单,让用户选择要上传的文件,点击"上传"按钮执行上传操作。

页面源码如下:
<!--
文件名:upload.html
作 者:cucuchen(chengang@rongji.com)
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<p> </p>
<p align="center">上传文件选择</p>
<FORM METHOD="POST" ACTION="jsp/do_upload.jsp"
ENCTYPE="multipart/form-data">
<input type="hidden" name="TEST" value="good">
<table width="75%" border="1" align="center">
<tr>
<td><div align="center">1、
<input type="FILE" name="FILE1" size="30">
</div></td>
</tr>
<tr>
<td><div align="center">2、
<input type="FILE" name="FILE2" size="30">
</div></td>
</tr>
<tr>
<td><div align="center">3、
<input type="FILE" name="FILE3" size="30">
</div></td>
</tr>
<tr>
<td><div align="center">4、
<input type="FILE" name="FILE4" size="30">
</div></td>
</tr>
<tr>
<td><div align="center">
<input type="submit" name="Submit" value="上传它!">
</div></td>
</tr>
</table>
</FORM>
</body>
</html>

<%-- 文件名:upload.html
作 者:cucuchen(chengang@rongji.com)
--%>
<%@ page contentType="text/html; charset=gb2312" language="java"
import="java.util.*,com.jspsmart.upload.*" errorPage="" %>
<html>
<head>
<title>文件上传处理页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<%
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 上传初始化
su.initialize(pageContext);
// 设定上传限制
// 1.限制每个上传文件的最大长度。
su.setMaxFileSize(1000000);
// 2.限制总上传数据的长度。
su.setTotalMaxFileSize(2000000);
// 3.设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。
su.setAllowedFilesList("doc,txt");
// 4.设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,
//jsp,htm,html扩展名的文件和没有扩展名的文件。
su.setDeniedFilesList("exe,bat,jsp,htm,html");
// 上传文件
su.upload();
// 将上传文件全部保存到指定目录,请在虚拟根目录下建一个upload文件夹
int count = su.save("/upload");
out.println(count+"个文件上传成功!<br>");

// 利用Request对象获取参数之值
out.println("TEST="+su.getRequest().getParameter("TEST")
+"<BR><BR>");

// 逐一提取上传文件信息,同时可保存文件。
for (int i=0;i<su.getFiles().getCount();i++)
{
com.jspsmart.upload.File file = su.getFiles().getFile(i);

// 若文件不存在则继续
if (file.isMissing()) continue;

// 显示当前文件信息
out.println("<TABLE BORDER=1>");
out.println("<TR><TD>表单项名(FieldName)</TD><TD>"
+ file.getFieldName() + "</TD></TR>");
out.println("<TR><TD>文件长度(Size)</TD><TD>" +
file.getSize() + "</TD></TR>");
out.println("<TR><TD>文件名(FileName)</TD><TD>"
+ file.getFileName() + "</TD></TR>");
out.println("<TR><TD>文件扩展名(FileExt)</TD><TD>"
+ file.getFileExt() + "</TD></TR>");
out.println("<TR><TD>文件全名(FilePathName)</TD><TD>"
+ file.getFilePathName() + "</TD></TR>");
out.println("</TABLE><BR>");

// 将文件另存,请在虚拟根目录下建一个download文件夹。
file.saveAs("/download/" + File.getFileName());
// 另存到以WEB应用程序的根目录为文件根目录的目录下
// file.saveAs("/download/" + File.getFileName(),
//su.SAVE_VIRTUAL);
// 另存到操作系统的根目录为文件根目录的目录下
// file.saveAs("c:\\temp\\" + File.getFileName(),
//su.SAVE_PHYSICAL);


}
%>
</body>
</html>
cucuchen 2003-12-07
  • 打赏
  • 举报
回复
jspSmartUpload虽然能下载文件,但对中文支持不足。若下载的文件名中有汉字,则浏览器在提示另存的文件名时,显示的是一堆乱码,很扫人兴。上面的例子就是这样。(这个问题也是众多下载组件所存在的问题,很少有人解决,搜索不到相关资料,可叹!)

为了给jspSmartUpload组件增加下载中文文件的支持,我对该组件进行了研究,发现对返回给浏览器的另存文件名进行UTF-8编码后,浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理,增加了toUtf8String这个方法,改动部分源码如下:

public void downloadFile(String s, String s1, String s2, int i)
throws ServletException, IOException, SmartUploadException
{
if(s == null)
throw new IllegalArgumentException("File ''" + s +
"'' not found (1040).");
if(s.equals(""))
throw new IllegalArgumentException("File ''" + s +
"'' not found (1040).");
if(!isVirtual(s) && m_denyPhysicalPath)
throw new SecurityException("Physical path is
denied (1035).");
if(isVirtual(s))
s = m_application.getRealPath(s);
java.io.File file = new java.io.File(s);
FileInputStream fileinputstream = new FileInputStream(file);
long l = file.length();
boolean flag = false;
int k = 0;
byte abyte0[] = new byte[i];
if(s1 == null)
m_response.setContentType("application/x-msdownload");
else
if(s1.length() == 0)
m_response.setContentType("application/x-msdownload");
else
m_response.setContentType(s1);
m_response.setContentLength((int)l);
m_contentDisposition = m_contentDisposition != null ?
m_contentDisposition : "attachment;";
if(s2 == null)
m_response.setHeader("Content-Disposition",
m_contentDisposition + " filename=" +
toUtf8String(getFileName(s)));
else
if(s2.length() == 0)
m_response.setHeader("Content-Disposition",
m_contentDisposition);
else
m_response.setHeader("Content-Disposition",
m_contentDisposition + " filename=" + toUtf8String(s2));
while((long)k < l)
{
int j = fileinputstream.read(abyte0, 0, i);
k += j;
m_response.getOutputStream().write(abyte0, 0, j);
}
fileinputstream.close();
}

/**
* 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
* 纵横软件制作中心雨亦奇2003.08.01
* @param s 原文件名
* @return 重新编码后的文件名
*/
public static String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i=0;i<s.length();i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).
toUpperCase());
}
}
}
return sb.toString();
}



注意源码中粗体部分,原jspSmartUpload组件对返回的文件未作任何处理,现在做了编码的转换工作,将文件名转换为UTF-8形式的编码形式。UTF-8编码对英文未作任何处理,对中文则需要转换为%XX的形式。toUtf8String方法中,直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码,之后将其转换为%XX的形式。

将源码编译后打包成jspSmartUpload.jar,拷贝到Tomcat的shared/lib目录下(可为所有WEB应用程序所共享),然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另,toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接。

小结:jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件,它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。
hajavaor 2003-12-07
  • 打赏
  • 举报
回复
加个filter
mysam 2003-12-07
  • 打赏
  • 举报
回复
和老大一样的问题!有建议String title=new String(su.getRequest().getParameter("title").getBytes("ISO8859-1"),"gb2312");这样的,可是我没有成功,解决了email给我wyx@sdau.edu.cn
freezh 2003-12-06
  • 打赏
  • 举报
回复
car_no = new String(car_no.getBytes("ISO-8859-1"), "utf-8").toString();

从页面读的时候这样试试
King6860 2003-12-06
  • 打赏
  • 举报
回复
传过来的中文参数可以直接得到,不用在去处理了,

你可以试一下,我的程序就没有处理SMARTUPLOAD 传过来的中文参数;
freezh 2003-12-06
  • 打赏
  • 举报
回复
你不用utf_8用gb2312就没事
hyc4132 2003-12-06
  • 打赏
  • 举报
回复
麻烦你有没有现成的代码给我贴一份让我研究一下吧?我对编码格式太模糊了,而且项目很紧,我又是刚毕业的新手,谢了!!
zl9732 2003-12-06
  • 打赏
  • 举报
回复
写个方法吧,在需要转的地方调用~
hyc4132 2003-12-06
  • 打赏
  • 举报
回复
关于字符转换的太多了,我的是UTF-8,不知道该怎么转才能正常显示
gong1 2003-12-06
  • 打赏
  • 举报
回复
是eclipse的问题。
你的加他的语言包。
^_^
hyc4132 2003-12-06
  • 打赏
  • 举报
回复
我用的是tomcat4.1+Eclipse做的JSP,我在页面头部加了<%@ page contentType="text/html;charset=gb2312"%>就是乱码,只有加了utf-8才能正常显示,我不知道在哪里可以改,太郁闷了,其他地方都做完了,就这一块弄的我都晕了
abcpl 2003-12-06
  • 打赏
  • 举报
回复
我们使用jspsmartupload都没有涉及中文处理的问题,也许和你的设置有关
你可以这样
在你使用的页面使用
<%@ page contentType="text/html;charset=gb2312"%>
凡是通过request获得的变量进行iso转码
cocosunshine 2003-12-05
  • 打赏
  • 举报
回复
意见于dorcom兄相同~
tiannet 2003-12-05
  • 打赏
  • 举报
回复
ncu.http.MultiPartRequest mRequest = new ncu.http.MultiPartRequest(null,request,sRealPath);
mRequest.setAutoFileName(false);
mRequest.parseAndSave();
sFileName= mRequest.getFileName("file_input");
sData = mRequest.getParameter("yourdata");
form:enctype="multipart/form-data"
dorcom 2003-12-05
  • 打赏
  • 举报
回复
car_no = new String(car_no.getBytes("ISO-8859-1"), "GB2312").toString();
转换一下字符集,想怎么转,就怎么转,看你的字符集怎么设定了。
dike103 2003-12-05
  • 打赏
  • 举报
回复
UP
chenyubang 2003-12-05
  • 打赏
  • 举报
回复
我也有同样问题,关注啊~~~~~~

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧