美文网首页
Java之文件下载

Java之文件下载

作者: CoderHong | 来源:发表于2017-11-11 13:54 被阅读13次

    Java实现文件的下载的方式

    超链接方式下载
    该方式就是一个链接,直接访问服务器中被下载文件的地址。
    该方式缺点:

    如果浏览器能够解析该文件的mime类型,则浏览器打开该文件,反之才下载。

    编码方式下载(访问Servlet)
    通过编码的方式实现下载是开发中常用的方式。
    步骤:

    1. 获取下载文件的文件名
    String filename = request.getParameter("name");
    
    1. 根据获取的文件名从而获得该文件的mineType
    ServletContext context = this.getServletContext();
    String mineType = context.getMimeType(filename);
    
    1. 设置的类型mime
    response.setContentType(mineType);
    
    1. 设置下载头信息
    response.setHeader("Content-disposition", "attachment;filename="+filename);
    

    5.提供流
    说明:该示例下载资源统一放在了工程目录WebContent下的download下,download后面的"/"千万别忘记写。

    InputStream is = context.getResourceAsStream("/download/"+filename);
    
    Snip20171111_1.png
    1. 对拷流
            // 3.1 获取输入流 // "/download"后必须有 "/"
            InputStream is = context.getResourceAsStream("/download/"+filename);
    
            // 3.2 获取输出流
            ServletOutputStream ostream = response.getOutputStream();
            
            // 对考
            int len=-1;
            byte[] b = new byte[1024];
            while((len=is.read(b)) != -1) {
                ostream.write(b, 0, len);
                System.out.println(".........传输中.........");
            }
            System.out.println(".........下载完成.........");
            
            // 关闭流
            ostream.close();
            is.close();
    

    第6步对拷流可以使用框架''common-io-1.4.jar"一句代码玩成

    下面是完整的代码:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 下载方式
            // 方式一 超链接下载 开发中用的比较少
            // 若浏览器能解析该资源的mime类型,则打开 否则下载
            // <a href="${pageContext.request.contextPath  }/download/Java WEB.xmind">下载Java WEB.xmind</a>
            
            // 方式二 编码下载 通过Servlet完成
            // 获取文件名称
            String filename = request.getParameter("name");
            System.out.println("filename="+filename);
            // 1.设置文件的mime类型
            // String mineType = this.getServletContext().getMimeType("文件名");
            ServletContext context = this.getServletContext();
            String mineType = context.getMimeType(filename);
            // System.out.println(mineType);
            response.setContentType(mineType);
            
            // 2.设置下载头信息
            // 注意Content-disposition 的C字母是大写 否则不会下载
    //      response.setHeader("content-desposition", "attachment;filename="+文件名称);
            response.setHeader("Content-disposition", "attachment;filename="+filename);
            
            // 3.提供流 对拷流
            // 3.1 获取输入流 // "/download"后必须有 "/"
            InputStream is = context.getResourceAsStream("/download/"+filename);
    
            // 3.2 获取输出流
            ServletOutputStream ostream = response.getOutputStream();
    
            // 使用框架 拷贝流
            IOUtils.copy(is, ostream);
            
            // 关闭流
            ostream.close();
            is.close();
    
        }
    

    文件名问中文问题

    中文名称的文件下载的下来的文件中文名称会出现问题。
    解决:

    • 常见的浏览器需要提供文件名称的utf-8编码 对于火狐来说需要提供文件名的base64编码
    // 将文件名称使用utf-8编码 解决了中文文件名想 下载下来的文件名称问题
    response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename, "utf-8"));
    

    但是这种方式只是解决了常见的浏览器,火狐浏览器还是存在问题,下载的文件名为类似%E7%AC%94%E8%AE%B0这种。接下来提供一个自己封装工具类DownLoadUtils针对浏览器作不同的文件名编码。

    DownLoadUtils.java

    public class DownLoadUtils {
        public static String getName(String agent, String filename) throws UnsupportedEncodingException {
            if (agent.contains("MSIE")) {
                // IE浏览器
                filename = URLEncoder.encode(filename, "utf-8");
                filename = filename.replace("+", " ");
            } else if (agent.contains("Firefox")) {
                // 火狐浏览器
                BASE64Encoder base64Encoder = new BASE64Encoder();
                filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
            } else {
                // 其它浏览器
                filename = URLEncoder.encode(filename, "utf-8");
            }
            return filename;
        }
    }
    

    那么我们可以使用工具类设置对应的编码了

    response.setHeader("Content-disposition", "attachment;filename="+DownLoadUtils.getName(request.getHeader("user-agent"), filename));
    
    Snip20171111_2.png

    相关文章

      网友评论

          本文标题:Java之文件下载

          本文链接:https://www.haomeiwen.com/subject/nmwimxtx.html