每日一得

          不求多得,只求一得 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)?{
          ????????????????
          %>
          ????????????????
          <a?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,?0,?4096))?>?-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 閱讀(35505) 評論(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.aygfsteel.com/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.aygfsteel.com/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 程瓊
          樓主愛你啊?。?!  回復  更多評論
            

          主站蜘蛛池模板: 建瓯市| 巴彦县| 明水县| 新郑市| 八宿县| 稷山县| 广昌县| 栖霞市| 封丘县| 天门市| 普宁市| 桐柏县| 穆棱市| 玛曲县| 庆城县| 上虞市| 尖扎县| 卫辉市| 鄯善县| 乐业县| 皮山县| 张家港市| 建湖县| 固原市| 西丰县| 永寿县| 沧州市| 长海县| 合山市| 沙坪坝区| 舟山市| 高青县| 汝南县| 巴南区| 三台县| 红安县| 中山市| 宁安市| 专栏| 科尔| 类乌齐县|