Servlet文件下载模板

Servlet文件下载模板

文件下载就是将服务器上已经存在的文件输出到浏览器。

常见的文件下载方式

超链接的方式

直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载,如果浏览器支持这个格式的文件,那么直接打开。

手动编码的方式

手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会提示下载。

既然文件下载就是将服务器上已经存在的文件输出到浏览器,那么要实现文件的下载,不仅需要指定文件的路径,还需要在HTTP协议中设置两个响应消息头:

设置的两个响应头
  1. Content-Type:文件类型.(MIME的类型)
    • response.setHeader(“Content-Type”, fileType);
  2. Content-Disposition:浏览器识别该格式文件,提示下载.
    • response.addHeader(“Content-Disposition”, “attachment;filename=”+filename);

一旦设定了这两个响应消息头,浏览器通常会直接处理响应的实体内容,需要在HTTP响应消息中设置两个响应消息头字段,用来指定接收程序处理数据内容的方式为下载方式。当单击“下载”超链接时,系统将请求提交到对应的Servlet。在该Servlet中,首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。

模板

Download页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>DownLoad</title>
    </head>
    <body>
        <h2>直接指向路径下载</h2>
        <%-- 直接指向路径下载会将中文进行编码,所以下载不会指向正确的中文路径,可以通过将路径修改为英文进行修复 --%>
        <a href="download/飞机.gif">飞机.gif</a><br/>
        <%-- 但是可以发现,如果这种类型是浏览器能够识别的类型,那么将不会启动下载器,而是直接显示文件 --%>
        <a href="download/Book.pdf">Book.pdf</a><br/>
        <%-- 不能识别,则会显示下载器 --%>
        <a href="download/java_ee_api.chm">java_ee_api.chm</a><br/>
        <h2>Servlet实现下载</h2>
        <%-- get方式中文使用的是ios-8859-1编码 --%>
        <a href="DownloadServlet?fileName=飞机.gif">飞机.gif</a><br/>
        <a href="DownloadServlet?fileName=Book.pdf">Book.pdf</a><br/>
        <a href="DownloadServlet?fileName=java_ee_api.chm">java_ee_api.chm</a><br/>
    </body>
</html>

DownloadServlet

package com.pc.download;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 获取参数
        String fileName = request.getParameter("fileName");
        // 对文件名进行转码,从iso-8859-1->utf-8
        fileName = new String(fileName.getBytes("iso-8859-1"), "utf-8");

        // 获取文件类型
        String fileType = request.getServletContext().getMimeType(fileName);
        // 获取文件所在真实路径
        String realPath = request.getServletContext().getRealPath("download/" + fileName);

        // 解决下载页面中文问题
        String userAgent = request.getHeader("User-Agent");
        // 火狐浏览器采用Base64编码
        if(userAgent.contains("Firefox")) {
            fileName = base64EncodeFileName(fileName);
        } else {
            fileName = URLEncoder.encode(fileName, "utf-8");
        }

        // 设置下载所需响应头
        // 设置文件mine类型
        response.addHeader("Content-Type", fileType);
        // 设置文件下载
        response.addHeader("Content-Disposition", "attachment;filename= " + fileName);

        // 创建文件字节流
        FileInputStream fis = new FileInputStream(realPath);
        OutputStream fos = response.getOutputStream();

        // 缓冲数组
        byte[] buf = new byte[4096];
        int len = 0;
        while((len = fis.read(buf)) != -1) {
            fos.write(buf, 0, len);
        }
        // 关闭文件流(response的文件流由容器管理,不需要关闭)
        fis.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    // 火狐浏览器编码问题
    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

配置web.xml

<servlet>
    <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.pc.download.DownloadServlet</servlet-class>
</servlet>  
<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>

PS:GitHub:https://github.com/Switch-vov/servlet-tools

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值