Servlet实现文件下载的功能

news2024/11/14 2:07:28

download.html

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件下载</title>
    <base href="<%=request.getContextPath()+"/"%>>">
</head>
<body>
<h1>文件下载</h1>
<a href="fileDownLoadServlet?name=2.png">点击下载图片</a><br/><br/>
<a href="fileDownLoadServlet?name=笔记.pdf">点击下载笔记</a><br/><br/>
</body>
</html>

FileDownLoadServlet

package com.sparrow.servlet;

import org.apache.commons.io.IOUtils;
import sun.misc.BASE64Encoder;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

/**
 * @Author: 诉衷情の麻雀
 * @Description: TODO
 * @DateTime: 2023/7/15 12:41
 **/
public class FileDownLoadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("FileDownLoadServlet被调用了");
        //准备下载的文件
        req.setCharacterEncoding("utf-8");
        String downLoadName= req.getParameter("name");
        //3.给HTTP响应,设置响应头Content-Type,就是文件的MiME
        ServletContext servletContext = req.getServletContext();
        String downLoadPath = "/download/";
        String downLoadFileFullPath = downLoadPath + downLoadName;
        String mimeType = servletContext.getMimeType(downLoadFileFullPath);
        resp.setContentType(mimeType);
        //4.给HTTP响应设置响应头Content-Disposition 是指定下载的数据的展示形式
        //如果是attachment则使用文件下载方式
        //如果是Firefox 则中文编码需要 base64
        if (req.getHeader("User-Agent").contains("Firefox")) {
            // 火狐 Base64编码
            resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" +
                    new BASE64Encoder().encode(downLoadName.getBytes("UTF-8")) + "?=");
        } else {
            // 其他(主流ie/chrome)使用URL编码操作
            resp.setHeader("Content-Disposition", "attachment; filename=" +
                    URLEncoder.encode(downLoadName, "UTF-8"));
        }
        //5.读取下载的文件数据,返回给客户端/浏览器
        // 1)创建一个和要下载的文件关联的输入流
        InputStream resourceAsStream = servletContext.getResourceAsStream(downLoadFileFullPath);
        //2) 得到返回数据的输出流【因为返回的文件大多是二进制字节】
        ServletOutputStream outputStream = resp.getOutputStream();
        //3)使用工具类,将输入流关联的文件对拷到输出流,并返回给客户端/浏览器
        IOUtils.copy(resourceAsStream, outputStream);
    }



}

在web下建一个目录将要下载的文件放入该项目下

在这里插入图片描述
## 项目演示
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端基本功 用 React Hooks + Antd 实现一个 Todo-List

背景 使用 React Hooks 以及组件库 Antd 来实现一个可以 增删 标记是否完成 的 todo-list 思路 要实现一个 todo-list 首先想到用 useState 维护一个状态数组来保存当前 list &#xff0c;还要用一个状态维护添加框中的内容 const [todos, setTodos] useState(initialValu…

OpenCv图像基本变换

目录 一、图像翻转 二、图像旋转 三、仿射变换之平移 四、仿射变换之获取变换矩阵 五、仿射变换之透视变换 一、图像翻转 图像翻转不等同于旋转&#xff0c;类似于一些视频的拍摄&#xff0c;拍摄后实际是左右颠倒的&#xff0c;通过图像翻转可进行还原 案例代码如下: …

第十四章:Context Encoding for Semantic Segmentation ——语义分割的上下文编码

0.摘要 近期的研究在使用全卷积网络&#xff08;FCN&#xff09;框架改善像素级标注的空间分辨率方面取得了显著进展&#xff0c;通过采用扩张/空洞卷积、利用多尺度特征和细化边界等方法。本文通过引入上下文编码模块来探索全局上下文信息对语义分割的影响&#xff0c;该模块捕…

springMVC的开发步骤-15

第一步你用到前端核心控制器&#xff0c;你应该有他&#xff0c;因此导包&#xff1a; 第二步:配servlet 第三步&#xff1a;配控制器&#xff0c;用来调用视图 结束之后我要干嘛&#xff1f;这个springMvC,我能否将这个pojo放到容器内部当中&#xff0c;能否通过bean标签进行配…

Linux 系统编程-开发环境(三)

目录 16 vim 16.1 vi简介 16.1.1 命令行模式 16.1.2 文本输入模式 16.1.3 末行模式 16.2 vim基础操作 16.3 vim分屏操作 16.4 vim打造IDE 16.4.1 简洁版IDE 17 gcc 18 toolchain 19 静态库和共享库 19.1 静态库 19.2 共享库 19.2.1 基础班使 19.2.2 就业班使用…

BiSeNetv2(pytorch)测试、训练cityscapes

1. 源码&#xff1a; github: https://github.com/CoinCheung/BiSeNet git clone https://github.com/CoinCheung/BiSeNet.git2. 预训练模型&#xff1a; 工程下载后解压&#xff0c;并在其中创建文件夹【model】用于存放预训练模型&#xff1b; 3. 运行demo conda creat…

【安装】Linux环境下的 JDK的安装 安装配置 环境变量

目录 Linux安装java环境1.检查系统中是否有JDK2.删除原有的java相关的包3.上传jdk到指定的文件夹4.解压jdk-8u371-linux-x64.tar.gz5.配置jdk的环境变量6.让配置生效 运行一个jar包运行jar包进行测试 Oracle 甲骨文中国 | 云应用和云平台 windows环境下的 JDK官网下载 & 安…

Android实现抓包 使用Fiddler抓包

Fiddler下载&#xff1a;https://pan.baidu.com/s/1QzvL0xugp6XX7gbFBFlEJg?pwdbf6u 提取码&#xff1a;bf6u 1.Fiddler配置 如果用不到https可以不开启https抓包 电脑打开fiddler&#xff0c;手机电脑同一网段。fiddler打开https抓包(Tools->Options->HTTPS)&a…

re学习(17)Bugku-re-Tworld(使用DFS解决迷宫问题)

下载地址&#xff1a; 跳转提示 参考视频&#xff1a; 【Bugku/CTF/Re/WP】使用DFS解决迷宫问题CTF "Tworld"_哔哩哔哩_bilibili 载入IDA后发现有UPX壳&#xff0c;先用工具进行脱壳&#xff0c;然后载入IDA进行分析。 编写脚本&#xff1a; #全部代码 import…

【电路原理学习笔记】第3章:欧姆定律:3.3 电压的计算

第3章&#xff1a;欧姆定律 3.3 电压的计算 电压相关欧姆定律公式&#xff1a; V I R VIR VIR 【例3-11】在图3-10所示的电路中&#xff0c;产生5A电流需要多大电压&#xff1f; 【答】 V I R 5 A 100 Ω 500 V VIR5\rm A\times 100Ω500 V VIR5A100Ω500V 【同步练习…

N天爆肝数据库——MySQL(5)

本文主要对索引进行了讲解 这里写目录标题 本文主要对索引进行了讲解索引概述介绍优缺点索引结构二叉树红黑树B-Tree(多路平衡查找树)BTreeBTree与B-Tree区别: HashHash索引特点 为什么InnoDB存储引擎选择使用BTree索引结构&#xff1f;索引分类在InnoDB存储引擎中&#xff0c;…

详解JS的四种异步解决方案!

目录 同步&异步的概念 js中异步的应用场景 实现异步的四种方法 1、 回调函数 2、Promise 3、Generator 4、 async/await 「异步编程」是前端工程师日常开发中经常会用到的技术&#xff0c;也是校招面试过程中常考的一个知识点。 通过掌握「异步编程」的四种方式&…

redis 和mongodb基础操作练习

目录 redis作业 string、list、hash 数据类型 举例说明list和hash的应用场景&#xff0c;每个至少一个场景 mongodb作业 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若干数据 文档格式如下 4. 查找 5. 增加、更新、删除、统计 re…

【电路原理学习笔记】第3章:欧姆定律:3.1 电压、电流与电阻的关系

第3章&#xff1a;欧姆定律 3.1 电压、电流与电阻的关系 欧姆定律指出&#xff1a;电流与电压成正比&#xff0c;与电阻成反比。即 I V R I\frac{V}{R} IRV​ 3.1.1 电压与电流之间的线性关系 数学上&#xff0c;线性指的是变量之间的关系在图形上是一条直线。线性方程所对…

数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

目录 引例 希尔增量序列 原始希尔排序 代码&#xff08;C语言&#xff09; 时间复杂度 更多增量序列 Hibbard增量序列 Sedgewick增量序列 希尔排序&#xff08;by Donald Shell&#xff09; 引例 给以下序列进行排序&#xff1a; 先以5的间隔进行插入排序&#xff1a…

自学数据结构和算法(5)

二叉树的遍历 分为先序、中序、和后序遍历。 这三种遍历都可以由递归序来得到&#xff1a; &#xff08;1&#xff09;先序遍历&#xff08;也是二叉树的深度优先遍历&#xff09;是第一次到某个结点才打印&#xff1b; &#xff08;2&#xff09;中序遍历是第二次到某个结…

【ACM】—蓝桥杯大一暑期集训Day3

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…

PCL 获取点集中距离最近的两个点(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 给定一个平面上n个点的点集,问题是找出点集中最近的点对。这个问题经常出现在许多应用程序中,例如,在空中交通管制中,监视靠得太近的飞机,因为这可能发生碰撞。这里实现一种方式来获取这两个点,具体计算过程如…

换零钱II:零钱面值动态变化,class方法自动兑换最少零钱(贪心算法)

银行现存零钱面值种类动态变化但数量无限&#xff0c;类方法change()完成指定金额的最少零钱个数兑换。 (本笔记适合学透python基本数据结构&#xff0c;熟悉class的基构造&#xff0c;对类内全局变量有一定认的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

C++并发编程(4):共享数据的问题、使用互斥量保护共享数据、死锁

在线程间共享数据 参考博客 线程间共享数据——使用互斥量保护共享数据 [c11]多线程编程(四)——死锁(Dead Lock) c多线程之死锁 C 死锁及解决办法 共享数据的问题 设想你有一段时间和朋友合租公寓&#xff0c;公寓只有一个厨房和一个浴室。除非你们的感情格外深厚&#xff0…