关于jspsmartupload中文名文件上传后为乱码的问题

纯转载:http://www.knowsky.com/3136.html  
   
  看了一些但做完不支持大文件上传就又找别的方法了  
   
  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程序开发过程中经常使用的上传下载组件,它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。     
 

有问题?直接google! <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_sdo.js" type="text/javascript"></script>

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

真正解决jspSmartUpload组件上传下载文件中文乱码问题。以前在网上也找过!!!下载了些,都没能解决中文乱码问题!自己改了源代码,并做成jar包,直接用就可以。 另,我把File()类 改成了 SmartFile()类。详情请下载。 另我的Blog有详细描述 http://blog.youkuaiyun.com/cartonwang/archive/2008/10/28/3168114.aspx 用朋友问到:译后的结果啊,怎么用啊 ------------------------------------------- 我看了下,给的是jar包。直接用就好了。用法和原版的差不多。稍微有点不同。原版:com.jspsmart.upload.File 我的:com.jspsmart.upload.SmartFile 原版的是File类,我的是SmartFile类。另,http://download.youkuaiyun.com/source/796632 中有上传文件不刷新页面的方法。我浦发银行的项目就是用这些方法。很好用。 ------------------------------------------------ gylsm发表的评论 真是晕死,用原版的上传还是支持中文的,你的连上传都成了乱码了,又没讲下你的用法和原版的区别,都不知道可不可以用 --------------------------------------------------------------------------- 我上面已经讲了吧,其实和原版的没有什么区别的,唯一一个地方要注意的是File()类我改成SmartFile()了,你用该类,改成SmartFile()类就好了。 如果还不能用,很可能是你没有把原来的Jar包给删除。 间:2009-04-09 18:45:48 来自:61.142.100.* ming100star发表的评论 谢谢伟大的楼主!! 间:2009-04-06 15:48:04 来自:220.249.99.* zwei27发表的评论 朋友太谢谢你了,我到网上怎么都找不到,你帮我搞定,SKS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值