文件下载示例

目录

1.目录结构

2.download页面

3.DownLoadServlet

4.中文文件名处理类


1.目录结构

2.download页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下载图片演示</title>
</head>
<body>
<h3>展示</h3>
<a href="/ThymeleafTest_war_exploded/images/图片1.jpeg">图片</a>
<a href="/ThymeleafTest_war_exploded/images/视频1.mp4">视频</a>
<hr>
<h3>下载</h3>
<a href="/ThymeleafTest_war_exploded/DownLoadServlet?filename=图片1.jpeg">图片</a>
<a href="/ThymeleafTest_war_exploded/DownLoadServlet?filename=视频1.mp4">视频</a>
</body>
</html>

3.DownLoadServlet

package servlets;

import utils.DownLoadUtils;

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.FileInputStream;
import java.io.IOException;

@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数,文件名称
        String filename=req.getParameter("filename");
        //找到文件路径
        ServletContext servletContext=this.getServletContext();
        String realPath=servletContext.getRealPath("/images/"+filename);

        FileInputStream fileInputStream=new FileInputStream(realPath);

        //设置响应头类型
        String mimeType=servletContext.getMimeType(filename);
        resp.setHeader("content-type",mimeType);

        //解决中文文件名
        String agent=req.getHeader("user-agent");
        filename= DownLoadUtils.getFileName(agent,filename);

        //设置响应头打开方式
        resp.setHeader("content-disposition","attachment;filename="+filename);

        //将输入流的数据写到输出流
        ServletOutputStream servletOutputStream=resp.getOutputStream();
        byte[] buffer=new byte[1024*8];
        int len=0;
        while ((len=fileInputStream.read(buffer))!=-1){
            servletOutputStream.write(buffer,0,len);
        }
        fileInputStream.close();
    }

}

4.中文文件名处理类

jdk8之前

import sun.misc.Base64Encoder;

jdk8之后

import java.util.Base64;

package utils;

import java.util.Base64;
import java.util.Base64.Encoder;
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")) {
            // 火狐浏览器
            Encoder encoder =Base64.getEncoder();
            filename = "=?utf-8?B?" + encoder.encodeToString(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值