| 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">附 件 </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一次还不行,实际上是第二次编码了

Alex 2006-06-14 22:48
|