(十六)Servlet教程——Servlet文件下载

news2024/11/25 20:21:47

Servlet文件下载

       文件下载是将服务器上的资源下载到本地,可以通过两种方式来下载服务器上的资源。第一种是使用超链接来下载,第二种是通过代码来下载。

超链接下载

       在HTML或者JSP页面中使用超链接时,可以实现页面之间的跳转,但是当超链接链接的资源时浏览器无法识别的资源时就会自动下载。

       当遇到浏览器能够直接处理的文件时,会在浏览器中默认显示出来,比如txt、png、jpg等。当浏览器支持download属性时,也可以通过设置download属性强制浏览器下载文件。

       首先我们需要在项目中创建一个下载文件所在的文件夹。

如图所示我们创建了一个download目录,然后准备好一些供下载的文件。

然后需要把包含下载文件的文件夹添加到服务器外部资源设置中。

点击下拉框中的编辑配置菜单

点击“部署”按钮切换到“部署”选项卡,点击该界面中的添加按钮(+号按钮)

点击添加按钮后的界面展示如下图所示

点击“外部源”菜单后的界面展示如下图所示

选择download目录,点击确定按钮

然后依次点击“应用”和“确定”按钮

在web app文件夹下创建一个download.html文件,文件的内容如下

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>文件下载</title>

</head>

<body>

<!--使用超链接联链接浏览器可以识别的资源-->

<a href="download/JavaEE.jpg">JPG图片</a>

<!--使用超链接联链接浏览器无法识别的资源-->

<a href="download/体检报告.rar">rar文件</a>

</body>

</html>

启动该应用后,在浏览器中输入如下URL:

http://localhost:8080/s001/download.html

界面展示如下图所示

点击“JPG图片”这个超链接后的界面展示如下图所示

点击“rar文件”后的界面展示如下图所示 

当给超链接设置了download属性,但是没有设置属性值时,将会使用默认的文件名下载文件。如果设置了download属性的值,就使用设置的值作为下载文件的文件名。

接下来我们使用后台的方式实现文件的下载。

首先我们需要准备一个供下载文件的Servlet类DownloadServlet。

该类的具体内容如下

@WebServlet("/downloadServlet")

public class DownloadServlet extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("文件下载...");

        //设置请求的编码

        request.setCharacterEncoding("UTF-8");

        //获取文件下载路径

        String path = getServletContext().getRealPath("/download/");

        //获取要下载的文件名,设计通过前端界面传递过来

        String fileName = request.getParameter("fileName");

        //参数增加非空判断 trim() 去掉字符串前后的空格

        if (fileName == null || "".equals(fileName.trim())) {

            response.getWriter().write("请输入要下载的文件名!");

            response.getWriter().close();

            return;

        }
        //通过路径得到file对象

        File file = new File(path + fileName);

        //判断file对象是否存在,并且是一个标准文件

        if (file.exists() && file.isFile()) {

            //设置响应类型 该响应指示浏览器将响应视为一个可以下载的文件

            //而不是在浏览器中直接打开

            response.setContentType("application/x-msdownload");

            //设置头信息

            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

            //得到输入流

            InputStream is = new FileInputStream(file);

            //得到输出流

            ServletOutputStream os = response.getOutputStream();

            //定义byte数组

            byte[] car = new byte[1024];

            //定义长度

            int len = 0;

            //循环输出

            while ((len = is.read(car)) != -1) {

                os.write(car, 0, len);

            }

            //关闭流 释放资源

            os.close();

            is.close();

        } else {

            response.getWriter().write("文件不存在,下载失败");

            response.getWriter().close();

        }

    }

}

     在之前的download.html中添加一个form,将form的action设置为上面创建的Servlet。

该界面更新后的代码如下

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>文件下载</title>

</head>

<body>

<!--使用超链接联链接浏览器可以识别的资源-->

<a href="download/JavaEE.jpg">JPG图片</a>

<!--使用超链接联链接浏览器无法识别的资源-->

<a href="download/体检报告.rar">rar文件</a>

<br>

<form action="downloadServlet">

    文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名">

    <button>下载</button>

</form>

</body>

</html>

完成上述工作后,启动该应用

在浏览器中输入如下URL:

http://localhost:8080/s001/download.html

在文本输入框中输入JavaEE.jpg,点击下载按钮,就可以成功下载download文件夹中的文件。

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

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

相关文章

开发环境虚拟环境学习记录

1、VS Code搭建python环境 下载好Visual Studio Code后&#xff0c;首先需要进入Visual Studio Code并安装支持python开发的插件&#xff1a; 2、虚拟环境 2.1、初识虚拟环境 概述&#xff1a;①、在使用Python语言的时候我们使用pip来安装第三方包&#xff0c;但是由于pip的…

Leetcode—138. 随机链表的复制【中等】

2024每日刷题&#xff08;129&#xff09; Leetcode—138. 随机链表的复制 实现代码 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { public:Node* copyRan…

Linux动态库与静态库解析

文章目录 一、引言二、C/C源文件的编译过程三、静态库1、静态库的定义和原理2、静态库的优缺点3、静态库的创建和使用a、创建静态库b、使用静态库 四、动态库1、动态库的定义和原理2、动态库的优缺点3、动态库的创建和使用示例a、创建动态库b、使用动态库 五、动静态库的比较 一…

【Python小技巧】matplotlib不显示图像竟是numpy惹的祸

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、问题&#xff1a;df.plot() 显示不出图像二、尝试各种解决办法1. 增加matplotlib.use&#xff0c;设定GUI2. 升级matplotlib版本 三、numpy是个重要的库1. …

详解MySQL常用的数据类型

前言 MySQL是一个流行的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;以满足不同数据处理和存储的需求。理解并正确使用这些数据类型对于提高数据库性能、确保数据完整性和准确性至关重要。本文将详细介绍MySQL中的数据类型&#xff0c;包括数值类型、字符…

算法分析 KMP算法中next值的计算、0/1背包问题

5.6.1 KMP算法中next值的计算 设模式的长度为m。用蛮力法求解 KMP算法中的 next值时&#xff0c;next[0]可直接给出&#xff0c;计算next[j](1<j<m-1)则需要在 T[0] …T[j-1]中分别取长度为j-1、..、2、1的真前缀和真后缀并比较是否相等&#xff0c;最坏情况下的时间代价…

2024------MySQL数据库基础知识点总结

-- 最好的选择不是最明智的&#xff0c;而是最勇敢的&#xff0c;最能体现我们真实意愿的选择。 MySQL数据库基础知识点总结 一、概念 数据库&#xff1a;DataBase&#xff0c;简称DB。按照一定格式存储数据的一些文件的组合顾名思义: 存储数据的仓库&#xff0c;实际上就是一…

Java初识继承

继承 文章目录 继承为什么需要继承继承中变量的访问特点继承中方法的访问特点继承的优缺点 概念:在Java中&#xff0c;继承是面向对象编程的一个基本特性。它允许我们定义一个新类&#xff0c;它从另一个已经存在的类继承其属性和方法。被继承的类称为父类或超类&#xff0c;新…

Linux进程——Linux进程与进程优先级

前言&#xff1a;在上一篇了解完一部分常见的进程状态后&#xff0c;我们先来把剩下的进程状态了解一下&#xff0c;再来进入进程优先级的学习&#xff01; 如果对前面Linux进程不太熟悉可以先阅读&#xff1a; Linux进程 本篇主要内容&#xff1a; 僵尸进程和孤儿进程 Linux进…

63-HDMI转VGA电路设计

视频链接 HDMI转VGA电路设计01_哔哩哔哩_bilibili HDMI转VGA电路设计 HDMI电路设计&#xff08;参考第13课&#xff09; VGA电路设计&#xff08;参考第15课&#xff09; DP转VGA电路设计&#xff08;参考第75课&#xff09; 1、HDMI转VGA转换器 2、HDMI转VGA简介 1、解…

融知财经:期货风险有多大,期货风险进行控制的方法

期货价格变化远大于股票市场&#xff0c;其风险也大于股票市场&#xff0c;当然其预期收益机会相对较高&#xff0c;因此期货更适合激进型投资者。在期货投资市场中&#xff0c;除了市场外的常见风险外&#xff0c;转型期投资者的投机心理和杠杆效应会增加期货的交易风险&#…

获取波形极值与间距并显示

获取并显示波形的极值与极值间距 1、流程 1、通过signal.find_peaks获取极大值 2、获取极大值下标 3、获取极大值对应的值 4、获取极大值的下标间距(就是隔多远有一个极大值) 5、获取极大值间距的标准差、方差、均值、最大值 6、图形展示波形图并标记极大值2、效果图 3、示…

铜价飙升,慧能泰HUSB332F带你狂飙

铜价&#xff0c;近期涨的很飘&#xff0c;涨到怀疑人生。继黄金后&#xff0c;铜成了另一个疯涨的明星&#xff01;作为电线电缆生产不可或缺的原材料&#xff0c;铜的身价暴涨直接拉响了成本警报&#xff0c;压缩了企业的利润空间。众多电线电缆制造商面临着严峻的挑战与考验…

嵌入式学习<1>:建立工程、GPIO

嵌入式学习_part1 本部分笔记用于学习记录&#xff0c;笔记源头 >>b站江科大_STM32入门教程 建立工程、GPIO 开发环境&#xff1a;keil MDK、STM32F103C8T6 1 &#xff09;建立工程 &#xff08;1&#xff09;基于寄存器开发、基于标准库 或者 基于HAL库开发; &…

【Python】字典题

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) for key,value in dic.i…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者&#xff1a;Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能&#xff0c;优先考虑攻击&#xff0c;而不是警报。 传统的安全信息与事件管理系统&#xff08;SIEM&#xff09;在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

DCEP数字人民币:中国法定区块链中数字货币

一、背景 作为全球第二大经济体&#xff0c;中国在数字货币领域的发展一直备受关注。近年来&#xff0c;中国政府积极推动数字货币的研究和试点工作&#xff0c;逐步开放数字货币交易试点&#xff0c;并计划推出中国唯一合法数字货币——数字人民币&#xff08;RMB Coin&#…

tcping的安装,ping和tcping的区别

ping和tcping的区别 功能不同&#xff1a; Ping&#xff1a;Ping是一种基于ICMP协议的网络工具&#xff0c;用于测试主机之间的连通性。它发送ICMP回显请求&#xff08;Echo Request&#xff09;到目标主机&#xff0c;并等待目标主机返回ICMP回显应答&#xff08;Echo Reply…

【Unity】使用Resources.LoadAll读取文件的顺序问题

最近在做客户的一个项目&#xff0c;其中的一个模块使用到了照片&#xff0c;但是发现了一个很严重的问题。当你在使用Unity的时候&#xff0c;它竟然不按照顺序读取&#xff1f;这个机器人是不是逻辑有问题&#xff1f;如下图&#xff1a; 名字脱敏了哈。。。 照片比较多&…

订单超时自动取消的实践方案

1、定时任务方案 方案流程&#xff1a; 每隔 30 秒查询数据库&#xff0c;取出最近的 N 条未支付的订单。 遍历查询出来的订单列表&#xff0c;判断当前时间减去订单的创建时间是否超过了支付超时时间&#xff0c;如果超时则对该订单执行取消操作。 定时任务方案工程实现相…