jsp实现文件下载与中文文件名乱码问题解决

时间:2021-08-28 13:22:32
之前,写过一个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,  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一次还不行,实际上是第二次编码了