文件下载Demo

实现文件下载

需求:
1.页面显示超链接
2.点击超链接弹出下载提示框
3.完成图片文件下载

分析:
1.超链接指向的资源如果被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框,不满足需求
2.任何资源都必须弹出下载提示框
3.使用响应头设置资源的打开方式

实现步骤:
1.定义页面,编辑超链接href属性,指向servlet,传递资源的filename
2.定义servlet
  2.1获取文件的名称
  2.2使用字节输入流加载文件进内存
  2.3指定response的响应头,
  2.4将数据写出到response输出流

3.设置响应头类型及响应头打开方式
4.在数据写入到输出流中
 
package com.infosys.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

@WebServlet("/downloadServlet")
public class ServletDownloadDemo1 extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//1.获取文件名称,也就是url请求什么文件,name对应拿到什么文件名 String filename = req.getParameter("filename"); //2.1创建ServletContext对象,来获取真实想路径 ServletContext context = this.getServletContext(); String realPath = context.getRealPath("/images/" + filename); //2.2创建文件输入流将项目路径内的文件加载到内存 FileInputStream fls = new FileInputStream(realPath); //3.设置响应头 String mimeType = getServletContext().getMimeType(filename); //3.1设置响应头类型 resp.setHeader("content-type", mimeType); //获取user-agent请求头 String agent = resp.getHeader("user-agent"); //使用工具类方法编译中文文件名 fileName = DownLoadUtils.getFileName(agent, filename); //3.2设置响应头打开方式 resp.setHeader("content-disposition", "attachment;filename=" + filename); //在数据写入到输出流中 ServletOutputStream sos = resp.getOutputStream(); byte[] buff = new byte[1024 * 8]; int len = 0; while ((len = fls.read(buff)) != -1) { sos.write(buff, 0, len); } fls.close(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }

 

download.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <a href="/response/downloadServlet?filename=like1.jpg">图片</a>
    <a href="/response/downloadServlet?filename=like1.avi">视频</a>
</body>
</html>

 

在download.html页面中点击超链接,就会访问到对应的servlet,执行doPost里的方法,对应完成资源的下载。

ps . 如果文件名是中文,在下载弹出框可能会出现中文无法显示的问题,可以通过此工具类来解决此问题。

import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


public class DownLoadUtils {

    public static String getFileName(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;
    }
}
posted @ 2019-07-30 22:46  Courage.Kiven  阅读(501)  评论(0编辑  收藏  举报