美文网首页
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