jsp、java下载附件

 1 传入此jsp中的参数均已URLDencoder过。
 2 
 3 <%@page import="java.net.URLEncoder"%>
 4 <%@page import="java.io.BufferedOutputStream"%>
 5 <%@ page contentType="text/html;charset=utf-8"  pageEncoding="utf-8"%>
 6 <%
 7     boolean isError = false;
 8     String errorMsg = "";
 9     response.reset();//可以加也可以不加
10     request.setCharacterEncoding("UTF-8");
11     String folder = "news";
12     if(request.getParameter("folder")!=null){
13         folder = "upload/"+(String)request.getParameter("folder");
14     }
15     String newname = request.getParameter("newname");
16     // 是否允许直接在浏览器内打开 
17        boolean isInline = false ; 
18         out.clear();
19         response.reset();
20         String filePath = request.getRealPath("/"+folder)+"/" +newname;
21         java.io.BufferedOutputStream output = null ;
22         java.io.BufferedInputStream input = null ;    
23     try {
24         java.io.File f  = new  java.io.File(filePath);
25         if(f.exists() && f.canRead()){
26             String mimetype = null;
27             mimetype = application.getMimeType( filePath );
28             if(mimetype==null){
29                 mimetype = "application/octet-stream;charset=utf-8";
30             }
31             response.setContentType(mimetype);
32              // IE 的话就只能用 IE 才认识的头才能下载 HTML 文件, 否则 IE 必定要打开此文件! 
33             String ua = request.getHeader("User-Agent"); //获取终端类型
34             if(ua==null ){ua = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;)";}
35             boolean isIE = ua.toLowerCase().indexOf("msie")!=- 1; //是否为 IE
36             if (isIE && !isInline) {
37                 mimetype = "application/x-msdownload";
38             }
39             response.setContentType(mimetype);
40               // 是否内联附件 
41             String inlineType = isInline?"inline":"attachment";
42                response.setHeader("Content-Disposition" , inlineType + ";filename=" + filename);
43               // 设置下载内容大小
44             response.setContentLength((int)f.length());
45             // 缓冲区 
46             byte[] buffer = new byte[ 4096 ];
47                 output = new java.io.BufferedOutputStream(response.getOutputStream());
48                 input = new java.io.BufferedInputStream(new java.io.FileInputStream(f));
49                 int n = (-1);
50                 while((n=input.read(buffer,0,4096))>-1){
51                     output.write(buffer,0,n);
52                 }
53                 response.flushBuffer();
54                 
55         }else{
56             isError = true;
57             errorMsg = "文件不存在!";
58         }
59        } catch(Exception ex) {
60         isError = true;
61         errorMsg = "您下载的文件出现异常!";
62        } finally {
63         if(isError){
64             String path = request.getHeader("Referer");
65             errorMsg=new String(errorMsg.getBytes("GBK"), "ISO8859_1");
66 %>
67             <script type="text/javascript">
68                 alert('<%=errorMsg%>');
69                 window.location.href='<%=request.getHeader("Referer")%>';
70             </script>
71 <%    
72         }
73             if(input!=null ){input.close();}
74             if(output!=null ){output.close();}
75             out.clear();
76             out = pageContext.pushBody();    
77     }  
78 %>









备注:
public void downBatchRateModelFile(String fileName,String downName, HttpServletResponse response,HttpServletRequest request) {
        try {
            
            String downPath = TemplateBuilder.getInstance().getBatchRateModelFold()+File.separator+fileName;
            // path是指欲下载的文件的路径。
            File file = new File(downPath);
            // 取得文件名。
            String filename = file.getName();
            
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") )
                    .toLowerCase();
            filename = downName+ext;
            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(downPath));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Length", "" + file.length());
            String mimetype = "application/octet-stream;charset=utf-8";
            String ua = request.getHeader("User-Agent"); // 获取终端类型
            if (ua == null) {
                ua = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;)";
            }
            boolean isIE = ua.toLowerCase().indexOf("msie") != -1; // 是否为 IE
            if (isIE) {
                mimetype = "application/x-msdownload";
                response.addHeader("Content-Disposition", "attachment;filename="
                        + java.net.URLEncoder.encode(filename, "UTF-8"));
            }else{
                response.addHeader("Content-Disposition", "attachment;filename="
                        + new String(filename.getBytes("GBK"),"ISO-8859-1"));
            }
            response.setContentType(mimetype);

            //response.setContentType("application/x-msdownload");
            OutputStream toClient = new BufferedOutputStream(
                    response.getOutputStream());
            //response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException e) {

        }
    }
Author:Pale Life
From: 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/live365wang/p/2438999.html