Java之文件下载

2017-11-11  本文已影响13人  CoderHong

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编码 解决了中文文件名想 下载下来的文件名称问题
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
上一篇下一篇

猜你喜欢

热点阅读