解决jspSmartUpload组件上传下载文件时中文乱码问
- 格式:doc
- 大小:33.00 KB
- 文档页数:7
彻底解决中文名文件下载和下载文件内容乱码问题之前,写过一个Download.jsp文件,可以解决下载文件乱码问题(诸如:DOC,XSL文件等等).后来发现,遇到中文名的文件的时候,文件下载将会报错~~~~今天,通过改写原Download.jsp文件已经彻底解决了这个问题~ 现在,把一整套的文件上传下载的方法给贴出来~~~以便大家借鉴!~!~!~!~!作者:古埃及法老-------------------------------------------------------------------------------------------------------------------测试环境:WEBLOGIC 8.1,WIN XP SP4,IE 6.0-----------------------------------------------------文件上传:-----------------------------------------准备工作:导入著名的SmartUpload.jar组件包upload.jsp文件------------------------------------------------------------------------------------------------------------------ upload_ok.jsp文件------------------------------------------------------------------------------------------------------------------文件下载:-----------------------------------------文件的超连接写法范例:<% String fname ="中文测试.xsl"; //假设你的文件名是:中文测试.xsl%><A target="_blank" href="Download.jsp?filename=<%=fname%>">下载</A> 文件的超连接写法范例-2 重新用utf-8对文件名编码:<%@ page contentType="text/html;charset=gb2312" session="true"%><% String name=.URLEncoder.encode("世界文化.doc","UTF-8"));%> <a href="c:\<%=name%>">世界文化.doc</a>Download.jsp文件------------------------------------------------------------------------------------------------------------------。
jsp乱码问题及其解决办法jsp乱码问题及其解决办法2019年04月09日星期五下午05:32困扰已久的乱码问题终于得到解决,希望下次出现更多问题,解决问题的过程很愉快!关于jsp乱码问题的解决2009-01-22 21:32关于jsp乱码问题的解决。
1最基本的乱码问题。
这个乱码问题是最简单的乱码问题。
一般新会出现。
就是页面编码不一致导致的乱码。
%@page language="java"pageEncoding="UTF-8"%%@page contentType="text/html;charset=gb2312"%html head title中文问题/title meta http-equiv="Content-Type"content="text/html;charset=UTF-8"/head/head body我是个好人/body/html三个地方的编码。
第一个地方的编码格式为jsp文件的存储格式。
Eclipse会根据这个编码格式保存文件。
并编译jsp文件,包括里面的汉字。
第二处编码为解码格式。
因为存为UTF-8的文件被解码为iso8859-1,这样如有中文肯定出乱码。
也就是必须一致。
而第二处所在的这一行,可以没有。
缺省也是使用iso8859-1的编码格式。
所以如果没有这一行的话,"我是个好人"也会出现乱码。
必须一致才可以。
第三处编码为控制浏览器的解码方式。
如果前面的解码都一致并且无误的话,这个编码格式没有关系。
有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。
因为页面有时候会嵌入页面,导致浏览器混淆了编码格式。
出现了乱码。
2表单使用Post方式提交后接收到的乱码问题这个问题也是一个常见的问题。
这个乱码也是tomcat的内部编码格式iso8859-1在捣乱,也就是说post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受。
彻底解决jsp中用SmartUpload上传附件中文乱码问题最近开发一个基于J2EE平台的DRP项目,其中需要上传下载大量的附件。
项目中所使用的数据库为Oracle8I,操作系统和Web应用服务程序为:①开发环境Win2000/Tomcat、②开发测试环境Win2000/WebSphere6.0,③正式环境Unix/WebSphere6.0,④正式环境的备用服务器Linux/WebSphere6.0。
在开发上传附件中出现了一个很普通很麻烦的问题,就是中文名称乱码问题,根据网上查询的资料,很快解决了①②③环境下的乱码,但④环境下依然是乱码。
最后,经过持续一个多月的研究实验,终于找到一种同时满足①②③④种环境的解决办法。
基本原理是:(1)、在上传之前,先对要上传的文件名进行编码;(2)、对编码后的文件名解码后,再插入数据库中。
基本实现如下面的代码片段,上传代码:......<input type="file" name="upFile" size="40" maxlength="100"><input type="button" name="btUpload" value="上传附件"onClick="doFileUpLoad();"><input type="hidden" name="table_name1" value="">......<script>function doFileUpLoad(){.....//使用javascript的函数escape编码后放到域table_name1中form1.table_name1.value = escape(form1.upFile.value);form1.submit();......}</script>JSP代码:......//获取上传的文件名,并用自编的unescape函数解码table_name1 =CUtil.unescape(mySmartUpLoad.getRequest().getParameter("table_name1"). toString());//分离目录信息,在数据库中只存储文件名table_name1 = CUtil.extractFileName(table_name1);......unescpe函数代码:public static String unescape(String src) {StringBuffer tmp = new StringBuffer();tmp.ensureCapacity(src.length());int lastPos = 0, pos = 0, nLen = src.length();char ch;while (lastPos < nLen) {pos = src.indexOf("%", lastPos);if (pos == lastPos) {if (src.charAt(pos + 1) == 'u') {ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);tmp.append(ch);lastPos = pos + 6;} else {ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);tmp.append(ch);lastPos = pos + 3;}} else {if (pos == -1) {tmp.append(src.substring(lastPos));lastPos = nLen;} else {tmp.append(src.substring(lastPos, pos));lastPos = pos;}}}return tmp.toString();}下载处理代码:......String FileName = rs.getString("NEWFILE_NAME"); //附件存储在服务器上的文件名String oFileName = rs.getString("OLDFILE_NAME"); //附件原来的文件名//以下代码的作用是,在浏览器中下载附件时,提示的中文名称不为乱码oFileName = new String(oFileName.getBytes("gb2312"),"iso8859-1"); mySmartUpLoad.downloadFile(FileName,null,oFileName);......提示:本系统使用SmartUpload组件上传/下载附件。
如何解决JSP中文乱码的问题一、Java中文问题的由来Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。
原因主要有两方面,Java和JSP 文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。
首先Java (包括JSP)源文件中很可能包含有中文,而Java和JSP 源文件的保存方式是基于字节流的,如果Java和JSP编译成class 文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。
基于这种乱码,建议在Java 文件中尽量不要写中文(注释部分不参与编译写中文没关系)如果必须写的话尽量手动带参数-ecoding GBK或-ecoding gb2312编译对于JSP在文件头加上<%@ page contentType=text/html;charset=GBK%:^<%@ page contentType=text/html;charset=gb2312%>基本上就能解决这类乱码问题。
二、常见的解决方式1,最基本的乱码问题。
这个乱码问题是最简单的乱码问题。
一般新会出现。
就是页面编码不一致导致的乱码。
<%@ page language=java pageEncoding=UTF-8%><%@ page contentType=text/html;charset=iso8859-1%><head><title> 中文问题</Mtle><meta http-equiv=Content-Type content=text/html;charset=UTF-8></head></head><body>我是个好人</body></html>三个地方的编码。
第一个地方的编码格式为jsp文件的存储格式。
JSP中文乱码问题解决方案中文乱码就是因为编码不符,可能出现乱码有四个地方:1 JSP编码乱码2 HTML编码乱码3 request获取数据乱码4 response输出信息乱码5 Cookie导致的编码问题下面将会对上面几种情况进行介绍:1 JSP乱码这种是最常见的,设置编码的位置位于JSP的第一行,如果在Eclipse中新建一个JSP默认是下面这种:<%@ page language="java"contentType="text/html; charset=ISO-8859-1"pageE ncoding="ISO-8859-1"%>可以看到它默认的页面编码和传输编码都是ISO-8859-1,这是用于欧洲国家的编码。
可以通过设置Eclipse中JSP的编码格式,来修改默认生成的编码格式。
如果想要支持中文,可以使用UTF-8、GB2312、GBK等,其中UTF-8是国际化的,哪个国家的都支持,所以推荐使用这个。
再来说说上面涉及到编码的两个地方:charset 和pageEncodingcharset是指服务器发往客户端展现时的编码;pageEncoding用于设置JSP页面本身的编码。
JSP在部署后提供给用户使用,会经过三个阶段:(1)JSP生成java文件:这个阶段会使用pageEncoding所定义的编码格式进行转换(2)java文件生成class文件:这个阶段由服务器tomcat自动使用utf -8编码把java文件转换成字节码class文件(3)通过读取class文件展现给用户:这个阶段由tomcat服务器获取字节码内容,通过使用contentType所定义的编码格式展现给用户。
大致过程如下图:这样设置好JSP中的第一行代码,就可以保证基本的JSP展现没有乱码了!<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncodi ng="UTF-8"%>2 HTML乱码因为JSP中也包含html的内容,HTML本身也是有编码格式的。
页面乱码这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定字符集编码即可代码如下数据库乱码这种乱码会使你插入数据库的中文变成乱码,或者读出显示时也是乱码,解决方法如下:在数据库连接字符串中加入编码字符集代码如下 String Url="jdbc:myql://localhot/digitgulfuer=root&paword=root&ueUnicode=true&characterEncoding=GB2312";并在页面中使用如下代码:代码如下 repone.etContentType("te某t/html;charet=gb2312"); requet.etCharacterEncoding("gb2312");URL传值乱码方法一:1. 在b.jp中把pageEncoding="GB2312"改为pageEncoding="ISO8859-1"虽然这样b.jp页面显示的内容还是乱码,但是不是那种“ ”的乱码,而是一些特殊字符2. 然后在浏览器中查看菜单中修改成GB2312的编码,这时乱码就显示中文了。
3. 但是这种方法是不可行的。
方法二:1. 在b.jp中把代码如下 String name=requet.getParameter("name");修改为代码如下 String name=new String(requet.getParameter("name").getByte("ISO-8859-1"),"GB2312");2. 这时再在页面上显示,则就是中文了。
方法三:在请求页面的请求参数需要用encodeURI进行转码,然后在接收请求的页面需要进行字符集转换。
JSP中文乱码问题有如下几个方面:页面乱码、参数乱码、表单乱码、源文件乱码。
下面来逐一解决其中的乱码问题。
一、JSP页面中文乱码在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。
先看一个JSP程序:[java]view plaincopyprint?1.<%@ page language="java"import="java.util.*" %>2.<html>3. <head>4. <title>中文显示示例</title>5.6. </head>7. <body>8.这是一个中文显示示例:9. <%10. String str = "中文";11. out.print(str);12. %>13. </body>14.</html>上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。
运行后在浏览器中显示如图所示原因在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代1.<%@ page language="java"import="java.util.*" contentType="text/html;charset=GB2312" %>再次运行乱码消失,原理就是向页面指定编码为GB2312,那么页面就会按照此编码来显示,于是乱码消失。
二、URL传递参数中文乱码一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。
下面是一个示例程序[java]view plaincopyprint?1.<%@ page language="java"import="java.util.*" contentType="text/html; charset=gb2312"%>2.<html>3. <head>4. <title>URL传递参数中文处理示例</title>5. </head>6. <%7. String param = request.getParameter("param");8. %>9. <body>10. <a href="URLCharset.jsp?param='中文'">请点击这个链接</a><br>11.你提交的参数为:<%=param%>12. </body>13.</html>上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果如下图对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。
JSP、Struts2下载中文文件名乱码问题方案一:原来处理下载的代码如下:response.setHeader("Content-Disposition", "attachment; filename=" + .URLEncoder.encode(fileName, "UTF-8"));下载的程序里有了这句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。
一. 上面方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。
这是IE的bug,参见微软的知识库文章KB816868 。
原因可能是因为ie在处理Response Header 的时候,对header的长度限制在150字节左右。
而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以便会报错。
微软提供了一个补丁。
这个补丁需要先安装ie6 sp1。
二. 我尝试使用javamail的MimeUtility.encode()方法来编码文件名,也就是编码成=?gb2312?B?xxxxxxxx?= 这样的形式,并从RFC1522 中找到对应的标准支持。
不过很遗憾,IE6并不支持这一个标准。
我试了一下,Firefox是支持的。
三. 按网上很多人提供的解决方案:将文件名编码成ISO8859-1似乎是有效的解决方案,代码如下:response.setHeader( "Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gb2312"), "ISO8859-1" ) );在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。
JSP中文乱码问题解决办法当用request对象获取客户提交的汉字字符时,会出现乱码问题,所以对含有汉字字符的信息必须进行特殊处理。
常见的几种字符集编码:⏹ASCII码:不支持中文⏹ISO-8859-1:不支持中文⏹GB2313、GBK:支持中文⏹Unicode:支持中文⏹UTF-8:支持中文在解决JSP中文乱码问题前,弄清以下几点:(1) windows平台采用的默认字符集编码是:GBK(2) IE浏览器默认采用UTF-8字符集编码方式发送Http请求。
(3) Tomcat在处理Get请求时,永远采用ISO-8859-1编码;Tomcat在处理Post请求时,默认采用ISO-8859-1编码;如果进行了如下设置request.setCharacterEncoding(“GBK”),则采用GBK编码。
可以使用如下几种方式解决JSP中文乱码问题。
1、方法一:调用自定义的转换函数<%@page contentType="text/html;charset=GB2312"%><%!public String getStr(String s) {String str = s;try {byte[] b = str.getBytes("ISO-8859-1");str = new String(b);return str;} catch (Exception e) {return str;}}%>使用内置对象request将获取的数据,使用ISO-8859-1进行重新编码,并保存到一个字节数组中,然后调用new String()方法,以GBK方式将这个字节数组构造出一个新的字符串,这个新的字符串就是我们想要的结果。
适用于以下三种情况:(1) 以Get方式提交表单,提交的数据中包含汉字字符。
(2) 以Post方式提交表单,提交的数据中包含汉字字符。
真正解决jspSmartUpload组件上传下载文件时中文乱码问题!!!2008-10-28 16:32 2294人阅读评论(23) 收藏举报1:当页面上传有参数时,中文会乱码,解决页面上中文参数乱码方法:修改类SmartUpload()中的upload()方法public void upload() throws ServletException,IOException,SmartUploadException{int i = 0;//boolean flag = false;boolean flag1 = false;//boolean flag2 = false;long l = 0L;//String s = "";//new String();//String s2 = "";//new String();String s4 = ""; //new String();String s5 = ""; //new String();String s6 = ""; //new String();String s7 = ""; //new String();String s8 = ""; //new String();String s9 = ""; //new String();String s10 = ""; //new String();m_totalBytes = m_request.getContentLength();m_binArray = new byte[m_totalBytes];int j;for(;i < m_totalBytes;i += j){try{m_request.getInputStream();j = m_request.getInputStream().read(m_binArray,i,m_totalBytes - i);}catch(Exception exception){throw new SmartUploadException("Unable to upload.");}}for(;!flag1 && m_currentIndex < m_totalBytes;m_currentIndex++){if(m_binArray[m_currentIndex] == 13){flag1 = true;}else{m_boundary = m_boundary + (char)m_binArray[m_currentIndex];}}if(m_currentIndex == 1){return;}for(m_currentIndex++;m_currentIndex < m_totalBytes;m_currentIndex = m_currentIndex + 2){String s1 = getDataHeader();m_currentIndex = m_currentIndex + 2;boolean flag3 = s1.indexOf("filename") > 0;String s3 = getDataFieldValue(s1,"name");if(flag3){s6 = getDataFieldValue(s1,"filename");s5 = getFileExt(s4);s7 = getContentType(s1);s8 = getContentDisp(s1);s9 = getTypeMIME(s7);s10 = getSubTypeMIME(s7);}getDataSection();if(flag3 && s4.length() > 0){if(m_deniedFilesList.contains(s5)){throw new SecurityException("The extension of the file is denied to be uploaded (1015).");}if(!m_allowedFilesList.isEmpty() && !m_allowedFilesList.contains(s5)){throw new SecurityException("The extension of the file is not allowed to be uploaded (1010).");}if(m_maxFileSize > 0L && (long)((m_endData - m_startData) + 1) >m_maxFileSize){throw new SecurityException("Size exceeded for this file : " + s4 + " (1105).");}l += (m_endData - m_startData) + 1;if(m_totalMaxFileSize > 0L && l > m_totalMaxFileSize){throw new SecurityException("Total File Size exceeded (1110).");}}if(flag3){SmartFile file = new SmartFile();file.setParent(this);file.setFileName(s4);file.setFileExt(s5);file.setFilePathName(s6);file.setIsMissing(s6.length() == 0);file.setContentType(s7);file.setContentDisp(s8);file.setTypeMIME(s9);file.setSubTypeMIME(s10);if(s7.indexOf("application/x-macbinary") > 0){m_startData = m_startData + 128;}file.setSize((m_endData - m_startData) + 1);file.setStartData(m_startData);file.setEndData(m_endData);m_files.addFile(file);}else{/***原来的代码,当页面上要传入中文参数时,乱码。
*///String s11 = new String(m_binArray,m_startData,(m_endData - m_startData) + 1);/***2008-10-28 carton修改,解决页面传入中文参数乱码*/String s11 = new String(m_binArray,m_startData,(m_endData -m_startData) + 1, "utf-8");m_formRequest.putParameter(s3,s11);}if((char)m_binArray[m_currentIndex + 1] == '-'){break;}}}2:当上传时文件名为中文时,解决中文乱码修改类SmartUpload()中的getDataHeader()方法private String getDataHeader(){//boolean flag = false;int i = m_currentIndex;int j = 0;for(boolean flag1 = false;!flag1;){if(m_binArray[m_currentIndex] == 13 && m_binArray[m_currentIndex + 2] == 13) {flag1 = true;j = m_currentIndex - 1;m_currentIndex = m_currentIndex + 2;}else{m_currentIndex++;}}/***原代码,当上传文件名为中文时,乱码*///String s = new String(m_binArray,i,(j - i) + 1);//return s;/***2008-10-28 carton修改,解决上传文件中文乱码问题 */Stirng s = null;try {s = new String(m_binArray,i,(j - i) + 1, "utf-8"); } catch (UnsupportedEncodingException e) {e.printStackTrace();}return s;}这样页面上就不用再转码了。
页面设置成"utf-8"编码即可。
附改好的jar包,和jspSmartUpload源代码.。