每日一得

不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速开发
最近关心的内容:SSH,seam,flex,敏捷,TDD
本站的官方站点是:颠覆软件

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  220 随笔 :: 9 文章 :: 421 评论 :: 0 Trackbacks
key words: jsp文件下载 中文乱码 文件名乱码

文件上传参看: 这里

碰到文件乱码,google了一下,发现这篇文章还不赖

摘录如下:


之前,写过一个Download.jsp文件,可以解决下载文件乱码问题(诸如:DOC,XSL文件等等).
后来发现,遇到中文名的文件的时候,文件下载将会报错~~~~
今天,通过改写原Download.jsp文件已经彻底解决了这个问题~
现在,把一整套的文件上传下载的方法给贴出来~~~以便大家借鉴!~!~!~!~! 
作者:古埃及法老

download.jsp文件
---------------------------------------------------------
<%
  java.io.BufferedInputStream bis
=null;
  java.io.BufferedOutputStream  bos
=null;
try{
 
String filename=request.getParameter("filename");
             filename
=new String(filename.getBytes("iso8859-1"),"gb2312");
 response.setContentType(
"application/x-msdownload");
 response.setHeader(
"Content-disposition","attachment; filename="+new String(filename.getBytes("gb2312"),"iso8859-1"));
 bis 
=new java.io.BufferedInputStream(new java.io.FileInputStream(config.getServletContext().getRealPath("files/" + filename)));
 bos
=new java.io.BufferedOutputStream(response.getOutputStream()); 
 
byte[] buff = new byte[2048];
 
int bytesRead;
 
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
  bos.write(buff,
0,bytesRead);
 }
}
catch(Exception e){
 e.printStackTrace();
}
finally {
 
if (bis != null)bis.close();
 
if (bos != null)bos.close();
}
%> 


注意,关键就是setHeader里的filename需要重新编码,格式是ISO-8859-1就OK了

以下是我自己项目中用到的代码片断,供参考:

list.jsp: 显示附件名称的页面
<tr>
            
<td height="25" class="tdcor">&nbsp;&nbsp;&nbsp;</td>
            
<td colspan="3" height=50>
                
<%
                    
if (null != publish.getAttatchFilename() &&
publish.getAttatchFilename().length() 
> 0) {
                
%>
                
<href="publish_do.jsp?method=download&fileName=
<%=URLEncoder.encode(publish.getAttatchFilename(),"
GBK")%>">
<%
=URLDecoder.decode(publish.getAttatchFilename(),"GBK")%></a>
                
<%
                    }
                
%>
            
</td>
</tr>

download.jsp:下载页面
else if (null != method && method.equals("download")) {//下载附件

        String fileName 
= request.getParameter("fileName");
        File file 
= new File(Constants.PUBLISH_FILE_PATH + "/" + URLDecoder.decode(fileName,"GBK"));
        response.reset();
        response.setContentType(
"application/octet-stream; charset=GBK");
        response.addHeader(
"Content-Disposition""attachment; filename=" + CourseDetailBusiness.transfer(URLDecoder.decode(fileName,"GBK"),"GBK","ISO-8859-1"));
        response.setContentLength((
int) file.length());

        
byte[] buffer = new byte[4096];
        BufferedOutputStream output 
= null;
        BufferedInputStream input 
= null;

        
// 写缓冲区:
        try {
            output 
= new BufferedOutputStream(response.getOutputStream());
            input 
= new BufferedInputStream(new FileInputStream(file));

            
int n = (-1);
            
while ((n = input.read(buffer, 04096)) > -1) {
                output.write(buffer, 
0, n);
            }
            response.flushBuffer();
        }
        
catch (Exception e) {
        } 
// maybe user cancelled download
        finally {
            
if (input != null) input.close();
            
if (output != null) output.close();
        }


说明:
1。文件名在数据库中保存的编码为URLEncode
2.在list.jsp显示的时候多了一次encode,不知为什么,不encode一次还不行,实际上是第二次编码了


posted on 2006-06-14 22:48 Alex 阅读(35481) 评论(35)  编辑  收藏 所属分类: web技术

评论

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-06-15 01:10 黑蝙蝠
感谢你啊 我遇到这个问题好久了啊 一直没找到解决方法!
只有用英文名字代替!  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-06-15 09:04 寒晴天
DYG  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-06-16 13:33 google
B CUO  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-06-19 21:31 Hi
多谢,哥们,非常感谢  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-08-10 10:53 一路顺风
让人非常感激的文章 楼下多转摘哦   回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-09-19 09:53 myloveroot
两个download.jsp文件,他们的代码组合到一起吗?  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-09-21 09:52 renyprrrre\
两个download.jsp文件怎么用  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-10-09 16:58 Java初心
好文章啊  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-10-30 17:12 bobo[匿名]
SRVE0026E: [Servlet 错误]-[已获取输出流]:java.lang.IllegalStateException: 已获取输出流
at com.ibm.ws.webcontainer.srt.SRTServletResponse.getWriter(SRTServletResponse.java:545)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java(Compiled Code))
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:193)
at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:246)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:197)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:255)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:249)
at org.apache.jsp._down_5F_document._jspService(_down_5F_document.java:219)
at com.ibm.ws.webcontainer.jsp.runtime.HttpJspBase.service(HttpJspBase.java:89)
at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code))
at com.ibm.ws.webcontainer.jsp.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:344)
at com.ibm.ws.webcontainer.jsp.servlet.JspServlet.serviceJspFile(JspServlet.java:683)
at com.ibm.ws.webcontainer.jsp.servlet.JspServlet.service(JspServlet.java:781)
at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code))
at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictServletInstance.java(Compiled Code))
at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLifecycleServlet.java(Compiled Code))
at com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycleServlet.java(Compiled Code))
at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLifecycleServlet.java(Inlined Compiled Code))
at com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance.java(Compiled Code))
at com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(ValidServletReferenceState.java(Compiled Code))
at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java(Inlined Compiled Code))
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java(Compiled Code))
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java(Compiled Code))
at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java(Compiled Code))
at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java(Compiled Code))
at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java(Compiled Code))
at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java(Compiled Code))
at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java(Compiled Code))
at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java(Compiled Code))
at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java(Compiled Code))
at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java(Compiled Code))
at com.ibm.ws.http.HttpConnection.run(HttpConnection.java(Compiled Code))
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))


怎么解决  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-12-11 19:53 BeanSoft
这个... 用 Weblogic 似乎也是同样的错误..

貌似要先调用一下 response.reset();  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2006-12-11 19:58 BeanSoft
http://www.blogjava.net/beansoft/archive/2006/12/11/87034.html

看看我转的这个文章...

JSP文件下载及出现getOutputStream() has already been called for ...的解决方法  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2007-01-27 16:00 老大感谢!
说什么好呢?只能说楼主我太爱你了。你的那句
new String(filename.getBytes("gb2312"),"iso8859-1"));拯救了我,谢谢!  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2007-03-20 17:19 mathfych
hao  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2007-11-29 15:19 rocker100
@黑蝙蝠
说什么很好,只能说楼主我太爱你了。  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2008-04-23 15:04 三水少
好帖,赞!  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2008-04-29 10:36
好东西  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2008-07-21 11:19 午夜晴天
谢过。。。。。。。。。。。。。
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
filename=new String(filename.getBytes("iso8859-1"),"gb2312");
  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2008-11-20 16:11 游客
为什么我的还是解决不了  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2008-11-20 16:13 游客
我的环境是tomcat5.5、mysql4.0  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2008-11-20 16:30 游客
当我用 String fileName = "测试.doc";
可以正常显示
但是我用 String fileName = request.getParameter("filename");
还是显示乱码!!

怎么回事啊?!?!  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2009-03-20 09:01 游客
好文章  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2009-03-20 09:02 游客
www.chinaitlab.com  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2009-03-20 09:02 游客
http://www.blogjava.net/alex/archive/2006/06/14/52855.aspx  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2009-03-20 09:03 游客
http://www.baidu.com  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2009-03-20 09:04 游客
d:\\hao.txt  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决[未登录] 2009-12-22 09:14 xma
作者真是帮了我大忙,让我知道这个问题的内在原因了,谢谢作者的好帖,大家帮忙顶啊。  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2010-07-23 09:49
谢谢了, String filename=new String(file.getBytes("iso8859-1"),"gb2312");
真有用,要不我还不知道怎么做呢。  回复  更多评论
  

# 已获得输出流 2011-05-03 21:34 唯一
@bobo[匿名]
在处理下载的jsp页面加上
out.clear();
out = pageContext.pushBody();  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2011-06-02 09:25 小佳
感谢楼主啊  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2011-06-02 09:25 小佳
感谢楼主  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2012-04-05 22:17 撑一支长篙
感谢楼主,真多亏那一句new String(filename.getBytes("gb2312"),"iso8859-1")),也多谢前面特别提及这一句的兄弟  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2012-09-27 10:47 jiangwei
把中文的文件名字进行URLEncoder.encode(filenamedisplay, "UTF-8")(filenamedisplay:文件名称)  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2013-04-19 15:34 abby
非常好用 谢谢  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2013-07-09 14:37 txt小说下载
乱码一直令我感到非常头疼。  回复  更多评论
  

# re: jsp实现文件下载与中文文件名乱码问题解决 2013-10-15 20:54 程琼
楼主爱你啊!!!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问