上传后,把中文名称保存进数据库,数据库中显示问号,在插入数据库之前,把中文名称打印出来都是正确的。
在中文名称保存进数据库的页面加
request.setCharacterEncoding("gb2312");
设定数据库默认字符集为gb2312
你用的是linux?
是不是数据库不支持, 或者附件名称是二级字库?
是这个SmartUpload上传组件的问题,楼主可以到网上找一下,有一个解决的方法是修改这个组件中的一个类。
我的邮件是:zchaozi@126.com。我可以把这个资料发给你。
也发给我一份谢谢geelpheels@sina.com
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目录下,然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另,toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接。
给你发了,顺便发了个反编译器,这样你就可以重新编译了。
很简单的直接用新建一个SmartUpload request对象获取就可以了,SmartUpload自己会提供中文的转换,不需要在做任何其他操作,呵呵!
改类是给自己找麻烦,
其实用request.setCharacterEncoding("gb2312");肯定可以完成,我一直都是这样用的.
而且这行代码最好放在你的过滤器中完成,一劳永逸!
newFileName=new String(myFile.getFileName().getBytes(),"GBK")
转码试试。
“我就是指直接用request对象获取上传文件的文件名称啊,获取了后,打印出来,中文显示都是正确的,但是吧这个名称存进数据库,就是问号了。数据库里面都显示问号,”
这样看来是数据库写入操作的问题,你的数据库?如果是mysql:
jdbc:mysql://127.0.0.1/yourdb?useUnicode=true&characterEncoding=GBK
顺便应该验证一下,其他应用存中文有问题吗?