`
sinye
  • 浏览: 219245 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jspsmartupload utf8支持

    博客分类:
  • java
阅读更多

相信很多朋友都用过这个上传下载组件,但是,这个组件默认使用的编码是gb2312的,因此,如果你的页面是utf-8的,就会出现乱码等问题。在这里,修改了一下里面的方法,这样可以支持utf-8编码的上传和下载。感兴趣的朋友可以按照下面的方法自己做一个,嫌麻烦的朋友直接去下面下载用就可以了。

具体修改步骤如下:

(1)修改SmartUpload类下的upload()方法

找到这一句,修改为下面包含utf-8的语句。 注意加粗部分

 

//String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);

String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1,"UTF-8");

 

(2)修改SmartUpload类下的getDataHeader()方法。注意加粗部分

找到这一句:String s = new String(m_binArray, i, (j - i) + 1);修改如下:

 

//String s = new String(m_binArray, i, (j - i) + 1);
String s=null;
try{
     String encode=m_response.getCharacterEncoding();
     if(encode.equalsIgnoreCase("UTF-8")){
             s = new String(m_binArray, i, (j - i) + 1,"UTF-8");
     }else{
             s = new String(m_binArray, i, (j - i) + 1);
     }
}catch(UnsupportedEncodingException e){
      e.printStackTrace();
}
return s;

  到此,就解决了utf-8编码的上传问题。接下来是utf-8编码的下载问题,修改如下:

 (1)增加一个方法Utf8String(String s)

 

/**
             * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
             * sinye修改于2010年1月29日
             * @param s 原文件名
             * @return 重新编码后的文件名
             */
            public static  String Utf8String(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();
        	}

 

  (2)修改downloadFile(String s, String s1, String s2, int i)方法,注意加粗部分

 

public void downloadFile(String s, String s1, String s2, int i) throws ServletException, IOException, SmartUploadException {
/* 528*/        if (s == null) {
/* 528*/            throw new IllegalArgumentException("File '" + s + "' not found (1040).");
                }
/* 531*/        if (s.equals("")) {
/* 531*/            throw new IllegalArgumentException("File '" + s + "' not found (1040).");
                }
/* 534*/        if (!isVirtual(s) && m_denyPhysicalPath) {
/* 535*/            throw new SecurityException("Physical path is denied (1035).");
                }
/* 539*/        if (isVirtual(s)) {
/* 539*/            s = m_application.getRealPath(s);
                }
/* 544*/        File file = new File(s);
/* 545*/        FileInputStream fileinputstream = new FileInputStream(file);
/* 547*/        long l = file.length();
/* 548*/        boolean flag = false;
/* 549*/        int k = 0;
/* 550*/        byte abyte0[] = new byte[i];
/* 553*/        if (s1 == null) {
/* 554*/            m_response.setContentType("application/x-msdownload");
                } else
/* 555*/        if (s1.length() == 0) {
/* 556*/            m_response.setContentType("application/x-msdownload");
                } else {
/* 558*/            m_response.setContentType(s1);
                }
/* 561*/        m_response.setContentLength((int)l);
/* 563*/        m_contentDisposition = m_contentDisposition != null ? m_contentDisposition : "attachment;";
/* 567*/        if (s2 == null) {
/* 567*/            m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + Utf8String(getFileName(s)));
                } else
/* 569*/        if (s2.length() == 0) {
/* 570*/            m_response.setHeader("Content-Disposition", m_contentDisposition);
                } else {
/* 572*/            m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + Utf8String(s2));
                }
/* 577*/        while ((long)k < l)  {
/* 577*/            int j = fileinputstream.read(abyte0, 0, i);
/* 578*/            k += j;
/* 579*/            m_response.getOutputStream().write(abyte0, 0, j);
                }
/* 581*/        fileinputstream.close();
            }

 这样,下载时的utf-8编码问题就解决了。然后自己再打成jar文件就ok了。

 

 

另外,我们在下载的时候会出现这种错误:org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response

解决办法,见代码:

 

String file = request.getParameter("file"); 
su.downloadFile(file); 


//解决 java.lang.IllegalStateException: 
//getOutputStream() has already been called for this response 
//这个问题 
out.clear(); 
out=pageContext.pushBody(); 

 由于jsp container在处理完成请求后会调用releasePageContet方法释放所用的PageContext object,
并且同时调用getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,解决 办法是:只需要在jsp页面的最后加上两条语句:  
out.clear();
out=pageContext.pushBody();即可(其中out,pageContext均为jsp内置对象!)

 

分享到:
评论
5 楼 zhyouyouzh 2010-04-15  
老大,我试过了你的jar包,还是会乱码。
反编译也是一样,迷茫中!
4 楼 sinye 2010-02-01  
georgejay 写道
感谢楼主的无私分享,  现在怎么都下载不了东西? 这个老提示5秒钟未必也太欺骗人了!
jiang-jay818@163.com 不知百忙之中是否可以发我一份, 不胜感激!

试了下,还真是不行,不知道为什么提示后,却不跳转,邮件已发送了,希望对你能有帮助!
3 楼 sinye 2010-02-01  
魔力猫咪 写道
第一,该组件早已经停止开发,网站也已经关闭。需要这类开源组件可以选择Apache的。
第二,虽然该组件可以免费使用,但是并不是开源软件。反编译涉嫌违法。

也是,当时没想到那么多,只想着能帮助大家解决使用这个组件的utf-8编码问题,毕竟大家都是奔着简单,好用的原则去用的,如果有这一点瑕疵,为什么不去改正它呢!
2 楼 魔力猫咪 2010-01-31  
第一,该组件早已经停止开发,网站也已经关闭。需要这类开源组件可以选择Apache的。
第二,虽然该组件可以免费使用,但是并不是开源软件。反编译涉嫌违法。
1 楼 georgejay 2010-01-31  
不胜感激!

相关推荐

    jspsmartupload支持UTF-8版本

    相信很多朋友都用过这个上传下载组件,但是,这个组件默认使用的编码是gb2312的,因此,如果你的页面是utf-8的,就会出现乱码等问题。在这里,修改了一些方法,这样可以支持utf-8编码的上传和下载。

    (支持UTF-8)---- jspSmartUpload.jar

    "jspSmartUpload.jar"是一个专为Java Web开发设计的库,用于处理文件上传任务,尤其强调对UTF-8字符集的支持。这个库在处理多语种环境下的文件上传时,能确保文件名和元数据的正确编码,避免了因字符集问题导致的...

    jspsmartupload.rar

    4. **字符编码支持**:对各种字符编码(如UTF-8、GBK等)的支持,确保中文字符正确显示。 5. **自定义配置**:开发者可以根据需要调整上传参数,如最大文件大小、允许的文件类型等。 在实际应用中,你可以在JSP页面...

    JspSmartUpload自定义编码版

    JspSmartUpload通过自定义编码方式,确保了文件名和上传数据在处理过程中保持正确的UTF-8编码,从而有效避免了这种问题。 **JSP**全称JavaServer Pages,是一种动态网页技术,它允许开发者在HTML代码中嵌入Java代码...

    jspSmartupload组件

    原始的jspSmartupload组件不支持中文上传,所以我把这个源码进行修改后,现在可以支持中文上传了,你的工程也必须是在统一的utf-8的编码环境下,因为我做的修改,就是将中文用utf-8进行编码。 我只测试了上传功能,...

    用jspsmartupload进行上传下载

    ### 使用jspSmartUpload进行文件上传与下载 #### jspSmartUpload简介 jspSmartUpload是一款用于处理文件上传功能的Java库,适用于JSP环境。它能够简化文件上传过程中的复杂度,提供一系列便捷的功能来帮助开发者...

    jspSmartUpload组件(支持中文)

    - **功能概述**:jspSmartUpload主要提供了文件上传、文件大小限制、多文件上传、断点续传等功能,同时支持文件类型的检查和错误处理,确保了上传过程的安全性和稳定性。 - **工作原理**:该组件通过JavaScript与...

    jspSmartUpload完美支持中文_源码和jar包

    《深入解析jspSmartUpload:中文完美支持的上传组件》 在Web开发中,文件上传功能是不可或缺的一部分。尤其是在处理多语言环境时,确保文件名和相关信息的正确显示尤为重要。`jspSmartUpload`就是一个专为Java Web...

    jspsmartupload源码

    JSpsmartupload针对这个问题进行了优化,可能采用了UTF-8作为统一的字符编码标准,确保在读取和保存文件名时保持正确的字符显示。 4. **文件名处理**: 文件名的乱码问题通常发生在文件上传后保存或者下载时显示。...

    jspsmartupload上传文件工程路径中文无乱码

    5. **数据库存储**:如果文件名需要存储在数据库中,确保数据库连接也支持UTF-8编码,并且数据库字段的字符集也是UTF-8。 6. **JSP页面编码**:在JSP页面中,使用`;charset=UTF-8" %&gt;`指令设置页面的编码。 通过...

    jspSmartUpload组件(已解决中文乱码问题)

    `jspSmartUpload`组件是Java Web开发中广泛使用的文件上传工具,尤其在早期的Web应用中,它提供了方便的文件上传功能。这个组件允许用户在网页上选择一个或多个文件,然后通过HTTP POST请求将这些文件上传到服务器。...

    jspsmartupload支持中文

    鉴于此,"jspsmartupload支持中文"的更新便是为了解决这一问题,使得开发者可以顺利上传包含中文字符的文件。 `SmartUpload`是一个基于Java的文件上传工具,它提供了丰富的API来处理文件上传的细节,如接收文件、...

    JspSmartUpload自定义编码终版

    该版本的JspSmartUpload修复了这一问题,确保在读取表单数据时,能够正确地将GBK编码的中文数据转换为UTF-8,保证了用户输入的中文信息在服务器端能够正确解析。 为了实现这些功能,JspSmartUpload可能采用了以下...

    jspsmartupload.jar 可以处理下载时中文乱码问题

    5. **兼容性**:考虑到不同浏览器和操作系统对编码的支持差异,`jspsmartupload.jar`做了良好的兼容性处理,可以适应各种环境。 为了使用`jspsmartupload.jar`,开发者需要在Java Web项目中引入该库,并按照其API...

    jsp 图片上传下载控件复制即可用支持中文附jspSmartUpload上传下载全攻略

    本指南将深入讲解如何使用`jspSmartUpload`控件实现图片的上传与下载,并且该控件还支持中文,使得非英文环境下的开发者也能轻松使用。 首先,我们需要了解`jspSmartUpload`的基本原理。它通过JavaScript与服务器端...

    jspsmartupload上传下载实例及详解

    JSPSmartUpload是专门为Java Servlet和JSP设计的文件上传解决方案,支持多文件上传、文件大小限制、文件类型检查等特性。它通过解析HTTP请求中的multipart/form-data数据来处理文件上传,使得开发者无需关心底层实现...

    jspsmartupload支持中文下载

    原jspSmartUpload组件对返回的文件未作任何处理,现在做了编码的转换工作,将文件名转换为utf-8形式的编码形式从而修复了了原jar包在下载时对中文乱码的问题。 经测试修改后的jar包名为utf8jspsmartupload.jar,使用...

    jspSmartUpload可设置编码格式版本,附带源码

    本资源提供的"jspSmartUpload可设置编码格式版本"是一个专为解决此类问题而设计的工具,它允许开发者自定义字符编码,从而有效地避免了在上传文件过程中可能出现的乱码现象。 `jspSmartUpload`是一个基于Java的文件...

Global site tag (gtag.js) - Google Analytics