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

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 {@Overrideprotected 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.mzph.cn/news/833971.shtml

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

相关文章

如何使用google.protobuf.Struct?

google.golang.org/protobuf/types/known/structpb 包提供了一种方式来创建和操作 google.protobuf.Struct 类型的数据。google.protobuf.Struct 是一种灵活的数据类型&#xff0c;可以表示任何结构化数据。 以下是如何使用 structpb 包的一些示例&#xff1a; 创建 Struct&a…

RK3568 学习笔记 : Linux emmc 内核启动 rootfs 根文件系统无法正常挂载问题的分析

问题描述 平台 &#xff1a; NanoPi-R5C 开发板 RK3568 平台。 手动编译的 Linux 内核&#xff0c;结果发现大概率 emmc 无法正常初始化&#xff0c;导致 rootfs 根文件系统无法正常挂载 Linux 内核版本&#xff1a; 6.1 Linux 内核代码位置&#xff1a; https://github.com…

Sql语法1

数据库语言大概可以分为四大类 1、DML&#xff1a;&#xff08;Database Manipulation Language&#xff09;:insert,update,delete 2、DQL&#xff1a;&#xff08;Database Query Language&#xff09;:select 3、DCL&#xff1a;&#xff08;Database Control Langu…

第2章 WebServer进阶

2.1 使用多线程处理多用户请求 2.1.1 多线程Socket通信 在上一章的案例中&#xff0c;服务端显然只能处理一次浏览器请求&#xff0c;请求一次浏览器端就结束程序。如何解决这个问题呢&#xff1f;可以采用多线程Socket通信技术&#xff0c;解决多用户并发请求。 在多线程Sock…

从谚语:“一手交钱,一手交货来”谈谈什么是数据库事务

事务与交易 一手交钱&#xff0c;一手交货 一手交钱&#xff0c;一手交货&#xff0c;谚语&#xff0c;意思是指钱和货当场相交&#xff0c;互不拖欠。出自明朝施耐庵《水浒传》第二一回。 Transaction 意思 我们先来看一下来自于剑桥英-英词典的解释&#xff1a; transac…

matlab中interp2函数应用

interp2 函数在 MATLAB 中用于进行二维插值。当使用 nearest 选项时&#xff0c;它会执行最近邻插值&#xff0c;即对于给定的目标点&#xff0c;函数将选择网格中距离其最近的点的值作为该目标点的插值结果。 以下是 interp2 函数在 nearest 模式下的用法示例&#xff0c;以及…

Flask-HTTP请求、响应、上下文、进阶实验

本节主要目录如下&#xff1a; 一、请求响应循环 二、HTTP请求 2.1、请求报文 2.2、Request对象 2.3、在Flask中处理请求 2.4、请求钩子 三、HTTP响应 3.1、响应报文 3.2、在Flask中生成响应 3.3、响应格式 3.4、Cookie 3.5、session&#xff1a;安全的Cookie 四、…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

Codeforces Round 940 (Div. 2) and CodeCraft-23 D. A BIT of an Inequality

A BIT of an Inequality 题目描述 给你一个数组 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​ 。求这样的图元&#xff08; x , y , z x, y, z x,y,z &#xff09;的个数&#xff1a; 1 ≤ x ≤ y ≤ z ≤ n 1 \leq x \leq y \leq z \leq n 1≤x≤y≤z≤…

汽车灯罩一般都是用什么材质做的?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩一般都是用什么材质做的&#xff1f; 汽车灯罩一般使用的主要材质是聚碳酸酯&#xff08;PC&#xff09;和丙烯酸酯&#xff08;PMMA&#xff09;这两种塑料。这两种材料具有良好的透明性、耐候性和耐冲击性&#xff0c;因此非常适合用于汽车灯罩的制造。 聚碳酸酯&am…

小程序支付的款项流转与到账时间

商家做小程序&#xff0c;最关心的是客户通过小程序下单支付的钱&#xff0c;是怎么样的流转状态以及最终到哪里。因此&#xff0c;本文将详细解析款项最终流向何处以及多久能够到账。 一、小程序支付的款项流向 当用户在小程序内完成支付后&#xff0c;款项并不会直接到达商…

5月8日学习记录

_[FBCTF2019]RCEService&#xff08;preg_match函数的绕过&#xff09; 涉及知识点&#xff1a;preg_match函数绕过&#xff0c;json的格式&#xff0c;正则回溯 打开环境&#xff0c;要求用json的格式输入 搜索学习一下json的语法规则 数组&#xff08;Array&#xff09;用方括…

Map-Reduce是个什么东东?

MapReduce是一种用于使用并行分布式算法在集群计算机上处理大型数据集的编程模型及其相关实现。这一概念首先由Google普及&#xff0c;并随后作为Apache Hadoop项目的一部分开源发布。 MapReduce的基本工作流程&#xff1a; 映射(Mapping)&#xff1a;这是第一阶段&#xff0c…

制造版图大变革!逾10座晶圆厂蓄势待发 | 百能云芯

在全球半导体产业的激烈竞争和市场需求的复杂波动中&#xff0c;晶圆厂建设热潮正在美国兴起&#xff0c;这一波建设浪潮的核心动力之一&#xff0c;便是美国政府推出的《芯片与科学法案》所承诺的巨额补贴&#xff0c;旨在提升美国在全球半导体行业的竞争力。 当地时间4月25日…

嵌入式—模块代码(一)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 程序结构GPIO操作UART操作接收逻辑发送 以下模板代码均基于官方2023.07.17版本。 程序结构 #include "Config.h" #inc…

JSP技术讲解

目录 1、JSP简介 2、JSP体验 3、JSP运行原理 4、JSP基本语法 5、JSP指令 6、JSP内置九大对象 7、JSP标签 8、JSP配置 9、JSP排错 10、总结 在前面的Servlet学习中发现Servlet本质是一个java程序&#xff0c;因此Servlet更加擅长编写程序的业务逻辑&#xff0c;而如果要…

部署kafka后启动报错(坑):无法指定被请求的地址

启动kafka后报错&#xff1a;org.apache.kafka.common.KafkaException: Socket server failed to bind to 127.0.0.1:9092: 无法指定被请求的地址 1、编辑配置文件 vim config/server.properties 2、在listeners PLAINTEXT://your.host.name:9092下方添加服务器内外网地址配…

shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)

目录 一、GeoJSON是什么 二、GeoJSON的结构组成 2.1、点&#xff08;Point&#xff09;数据示例 2.2、线&#xff08;LineString&#xff09;数据示例 2.3、面&#xff08;Polygon&#xff09;数据示例 2.4、特征&#xff08;Feature&#xff09;数据示例 2.5、特征集合&…

Hass哈斯数控数据采集网络IP配置设置

机床数据采集&#xff08;MDC&#xff09;允许你使用Q和E命令通过网络接口或选项无线网络从控制系统提取数据。设置143支持该功能&#xff0c;并且指定控制器使用这个数据端口。MDC是一个需要一台附加计算机发送请求&#xff0c;解释说明和存储机床数据的软件功能。这个远程计算…

android 预加载进程

目录 一.背景 二.实现 1. 创建预加载服务类 2.清单文件中注册并制定 android:process 要预加载的进程 3.开启和停止 一.背景 做阅读器独立进程时&#xff0c;打开阅读器阅读页面所在的Activity&#xff0c;会出现白屏或黑屏 也就是说从一个进程activity跳转另一个进程的a…