美文网首页
Web 基础25 文件下载概述及其入门案例

Web 基础25 文件下载概述及其入门案例

作者: 小熊先生很不开心 | 来源:发表于2018-04-05 12:48 被阅读13次

    1.1 文件的下载概述

    • 文件下载
      • 服务器通过网络以流的形式将文件发送到客户端的过程
    • 应用场景
      • 电影下载
      • 音乐下载
      • 安装文件下载
    • 实现方式
      • 方式1
        • 可以使用超链接来实现文件的下载
        • <a href="要下载文件的地址" >下载</a>
        • 注意:如果要下载的文件类型是浏览器支持的类型,浏览器会直接打开这个文件,并不会下载这个文件,比如图片
      • 方式2
        • 可以使用代码来实现文件的下载
        • 需要有两个头和一个流
          • Content-type 设置要下载文件的类型(MIME类型)
          • Content-Disposition 通知浏览器,你不要关心下载文件的类型,什么类型的文件都进行下载操作
          • 字节输出流 response.getOutputStream()

    1.2 超链接方式实现文件下载的功能

    • 好处:简单
    • 缺点:
      • 必须要是浏览器不能识别的格式,否则就会直接打开
      • 如果资源放在web-inf路径下面,就没法获取

    1.3 代码方式实现文件下载的功能

    • 首先配置一下下载文件在项目中
    放置下载资源.png
    • 编写一个下载页面
    <body>
        <h1>超链接实现文件下载功能</h1>
        <a href="${pageContext.request.contextPath}/download/pic01.jpg" >pic01.jpg</a>
        <br />
        <a href="${pageContext.request.contextPath}/WEB-INF/pic01.jpg" >WEB-INF/pic01.jpg</a>
        <br />
        <a href="${pageContext.request.contextPath}/download/pic01.zip" >pic01.zip</a>
    </body>
    

    注意:浏览器会根据是否能解析资源来选择是显示还是下载的
    WEB-INF的资源浏览器无法访问

    • 使用代码实现

    也需要编写一个下载页面跳转Servlet

    <h1>代码方式实现文件下载的功能</h1>
    <a href="${pageContext.request.contextPath}/DownloadServlet" >pic01.jpg</a>
    
    
    • 编写Servlet
    package com.itbear.download;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class DownloadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        public DownloadServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //路径
            String realPath = getServletContext().getRealPath("/download");
            //名称
            String fileName = "pic01.jpg";
            //设置两个头
            String mimeType = getServletContext().getMimeType(fileName);
            response.setContentType(mimeType);
            
            response.setHeader("Content-Dispostion", "attachment;filename="+fileName);
            //IO流传输
            ServletOutputStream os = response.getOutputStream();
            
            FileInputStream fis = new FileInputStream(realPath+"/"+fileName);
            
            byte[] bys = new byte[1024];
            int len = 0;
            while((len = fis.read(bys)) != -1){
                os.write(bys,0,len);
            }
            
            fis.close();
            
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    
    • 动态获取代码

    URL是可以 进行拼接 提交参数数据的

    
    <h1>代码方式实现文件下载的功能</h1>
    <a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=pic01.jpg" >pic01.jpg</a>
    <br />
    <a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=pic01.zip" >pic01.zip</a>
    <br />
    
    
    

    提交path 和 fileName

    • 改写Servelt
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //路径
            String path = request.getParameter("path");
            String realPath = getServletContext().getRealPath("/" + path);
            //名称
            //String fileName = "pic01.jpg";
            String fileName = request.getParameter("fileName")
            
            
            //设置两个头
            //设置Content-type
            String mimeType = getServletContext().g-etMimeType(fileName);
            response.setContentType(mimeType);
            //设置Content-Disposition
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
            
            //获取输出流
            OutputStream os = response.getOutputStream();
            //创建输入流
            InputStream is = new FileInputStream(realPath + "/" + fileName);
            byte[] bys = new byte[1024];
            int len = 0;
            while((len = is.read(bys)) != -1) {
                os.write(bys,0,len);
            }
            
            is.close();
                
        }
    
    
    • 乱码问题
    
    <a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=小熊先生.jpg" >小熊先生.jpg</a>
    

    这样的传入中文会导致乱码

    需要进行重新设置编码

    String fileName = new String(request.getParameter("fileName").getBytes("ISO-8859-1"),"UTF-8");
    
    

    相关文章

      网友评论

          本文标题:Web 基础25 文件下载概述及其入门案例

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