板块一 Servlet编程:第八节 文件上传下载操作 来自【汤米尼克的JavaEE全套教程专栏】

news2025/4/27 8:24:47

板块一 Servlet编程:第八节 文件的上传下载操作

  • 一、文件上传
    • (1)前端内容
    • (2)后端内容
  • 二、文件下载
    • (1)前端的超链接下载
    • (2)后端下载

在之前的内容中我们终于结束了Servlet五大对象的学习,我们发现这些对象在操作数据时往往只是简单的参数传递,那我们该如何操作更复杂的资源呢?比如要在后端上传下载一个文件,这一节完善一个Servlet的重要知识,就是文件的上传下载操作

一、文件上传

(1)前端内容

  1. 使用表单提交
  2. 设置表单的提交类型为POST请求 method="post"
  3. 设置表单类型为文件上传表单 enctype="multipart/form-data"
  4. 设置文件提交的地址
  5. 准备表单元素
    - 普通的表单项 type="text"
    - 文件项 type="file"
  6. 设置表单元素的name属性值(表单提交一定要设置表单元素的name属性值,否则后台无法接收数据!)

html code

<form method="post" enctype="multipart/form-data" action="uploadServlet">
	姓名:<input type="text" name="uname" > <br>
	文件:<input type="file" name="myfile"> <br>
	<!-- button默认的类型是提交类型 type="submit" -->
	<button>提交</button>
</form>

在这里插入图片描述

(2)后端内容

使用注解 @MultipartConfig 将一个Servlet标识为支持文件上传。Servlet将multipart/form-data
POST 请求封装成一个Part对象,通过Part对象的方法对上传的文件进行操作。

实例,详解见代码注释

package com.TommyNike.servlet;

import javax.servlet. ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet. annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io. IOException;

@webServlet("/uploadservlet") //与前端的表单的action一致
@MultipartConfig // 如果是文件上传表单,一定要加这个注解
public class Uploadservlet extends HttpServlet {

@override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
	
	request.setCharacterEncoding("UTF-8"); // 设置请求的编码格式
	
	// 获取普通表单项 (文本框)
	String uname= request.getParameter("uname");  //"uname"与文本框的name属性值一致
	// 通过 getPart(name)方法获取Part对象 (name代表的是页面中file文件域的name属性值)
	Part part = request.getPart("myfile");
	// 通过Part对象,获取上传的文件名
	String fileName = part.getSubmittedFileName();
	// 获取上传文件需要存放的路径 (得到项目存放的真实路径)
	String realPath = request.getServletContext().getRealPath("/");
	// 将文件上传到指定位置
	part.write(realPath + fileName);
    }
}

注意:
只要前端表单的属性值为enctype="multipart/form-data",即表单的类型为文件上传表单,Servlet后端就一定要加注解@MultipartConfig,否则表单的内容无法传递到后端

二、文件下载

文件下载,即将服务器上的资源下载(拷贝)到本地,我们可以通过两种方式下载。第一种是通过超链接本
身的特性来下载;第二种是通过代码下载。

注意:
在Idea中,需要在服务器编辑配置->部署->点击+,把外部资源添加到服务器中,资源才能在浏览器中被访问到
在这里插入图片描述

(1)前端的超链接下载

当我们在HTML或JSP页面中使用a标签时,原意是希望能够进行跳转,当遇见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如 txt、png、jpg等。但当超链接遇到浏览器不识别的资源时会自动下载,比如zip压缩包等。当然我们也可以通过download属性规定浏览器进行下载,但有些浏览器并不支持。

默认下载

<!-- 当超链接遇到浏览器不识别的资源时,会自动下载 -- >
<a href="test.zip">超链接下载</a>

指定 download属性下载
download属性可以不写任何信息,会自动使用默认文件名。如果设置了download属性的值,则使用设置的值做为文件名。当用户打开浏览器点击链接的时候就会直接下载文件。

<!-- 当超链接遇到浏览器识别的资源时,默认不会下载。通过download属性可进行下载 -- >
<a href="test.txt" download>超链接下载</a>

(2)后端下载

实现步骤

  1. 需要通过 response.setContentType 方法设置Content-type头字段的值为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,也就是让浏览器无法识别它。例如"application/octet-stream""application/x-msdownload"等。
  2. 设置左下角那个下载框:需要通过响应头 response.setHeader 方法设置Content-Disposition头的值为"attachment;filename=文件名”
  3. 读取下载文件,调用输出流response.getOutputStream方法向客户端写入附件内容。

实例,详解见代码注释

package com.TommyNike.servlet;

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

public class Downloadservlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
	// 设置两端的编码格式
	request.setCharacterEncoding("UTF-8");
	request.setContentType("text/html;charset=UTF-8");
	// 获取文件下载路径
	String path = getServletContext().getRealPath("/");
	//获取要下载的文件名
	String name = request.getParameter("fileName");
	if (name == null || "".equals(name .trim())) { //文件名判空
	response.getWriter().write( s:"请输入要下载的文件名!");
	response.getWriter().close();
	return;}
	//通过路径得到file对象
	File file = new File(path + name);
	//判断file对象是否存在,且是否是一个标准文件
	if (file.exists() && file.isFile()) {
		// 设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的类型)
		response.setContentType("application/x-msdownload");
		// 设置下载文件的名称:name
		response.setHeader("Content-Disposition", "attachment; filename=" + name);
		// 得到输入流
		InputStream is = new FileInputStream(file);
		// 得到输出流
		ServletOutputStream os = response.getOutputStream();
		//定义byte数组
		byte[] car = new byte[1024];
		//定义长度
		int len = 0;
		// 循环 输出
		while ((len = is.read(car)) != -1) { // != -1 :不为空
			os.write(car, 0, len);
		}
		// 关闭流 释放资源
		os.close();
		is.close();
		} else {
			System.out.println("文件不存在,下载失败!");
		}
	}
}

以上就是本专栏Servlet板块的全部内容了,欢迎读者在评论区提出意见反馈,博主也很乐于私信交流。下一个板块我们将着重详解Java EE的另一个基石:JSP和JSTL

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

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

相关文章

C++——基础语法(2):函数重载、引用

4. 函数重载 函数重载就是同一个函数名可以重复被定义&#xff0c;即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢&#xff1f;所以同一个函数名的函数之间肯定是要存在不同点的&#xff0c;除了函数名外&#xff0c;还有返回类型和参数两部分可以…

【Linux】 faillock 命令使用

faillock 命令 faillock 命令是 PAM (Pluggable Authentication Modules) 的一部分&#xff0c;它被设计用来跟踪失败的登录尝试&#xff0c;并在连续失败尝试超过某个阈值时锁定账户。这个功能可以帮助系统管理员识别和防止暴力破解攻击。当一个用户连续多次输入错误的密码后&…

Vue.js+SpringBoot开发超市商品管理系统

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

Python中的functools模块详解

大家好&#xff0c;我是海鸽。 函数被定义为一段代码&#xff0c;它接受参数&#xff0c;充当输入&#xff0c;执行涉及这些输入的一些处理&#xff0c;并根据处理返回一个值&#xff08;输出&#xff09;。当一个函数将另一个函数作为输入或返回另一个函数作为输出时&#xf…

项目实战:Qt监测操作系统物理网卡通断v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136276999 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

数据结构-列表LinkedList

一,链表的简单的认识. 数组,栈,队列是线性数据结构,但都算不上是动态数据结构,底层都是依托静态数组,但是链表是确实真正意义上的动态数组. 为什么要学习链表? 1,链表时最简单的动态数据结构 2,掌握链表有助于学习更复杂的数据结构,例如,二叉树,trie. 3,学习链表有助于更深入…

fpga_硬件加速引擎

一 什么是硬件加速引擎 硬件加速引擎&#xff0c;也称硬件加速器&#xff0c;是一种采用专用加速芯片/模块替代cpu完成复杂耗时的大算力操作&#xff0c;其过程不需要或者仅需要少量cpu参与。 二 典型的硬件加速引擎 典型的硬件加速引擎有GPU&#xff0c;DSP&#xff0c;ISP&a…

【Web】CTFSHOW 常用姿势刷题记录(全)

目录 web801 web802 web803 web804 web805 web806 web807 法一&#xff1a;反弹shell 法二&#xff1a;vps外带 web808 web809 web810 web811 web812 web813 web814 web815 web816 web817 web818 web819 web820 web821 web822 web823 web824 web825…

python统计分析——单因素方差分析

参考资料&#xff1a;用python动手学统计学 方差分析&#xff1a;analysis of variance&#xff0c;缩写为ANOVA 1、背景知识 1.1 要使用方差分析&#xff0c;数据的总体必须服从正态分布&#xff0c;而且各个水平内部的方差必须相等。 1.2 反复检验导致显著性结果更易出现…

专业130+总分410+上海交通大学819信号系统与信号处理考研上交电子信息通信生医电科,真题,大纲,参考书。

今年考研顺利结束&#xff0c;我也完成了目前人生最大的逆袭&#xff0c;跨了两个层级跨入c9&#xff0c;专业课819信号系统与信息处理135&#xff0c;数一130总分410&#xff0c;考上上海交大&#xff0c;回想这一年经历了很多&#xff0c;也成长了很多。从周围朋友&#xff0…

Mysql数据库学习之范式

范式 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则称为范式。可以理解为&#xff0c;一张数据表的设计结构需要满足的某种设计标准的级别&#xff0c;要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 范式都包含哪些 6种范式…

在当前源文件的目录或生成系统路径中未找到文件

vsqt中增加&#xff0c;减少文件&#xff0c;都必须要动一下cmakelist.txt,点一下换行或者保存 因为vsqt反应不过来 1。都必须要动一下cmakelist.txt,点一下换行或者保存 2.然后全部重新生成&#xff0c;或者重新扫描解决方案&#xff08;多扫几次&#xff09;

SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示

目录 前言 一、加入DWZ J-UI框架 二、实现登录页面 三、实现主页面菜单显示 前言 大家好&#xff01;写文章之前先列出几篇相关文章。本文内容也在其项目中接续实现。 一. SSM项目集成Spring Security 4.X版本&#xff08;使用spring-security.xml 配置文件方式&#xff…

IDEA中Vue的安装和使用【window10】

一.准备工作 Vue是前端开发框架。搭建框架&#xff0c;首先要搭建环境。搭建Vue的环境工具&#xff1a;node.js&#xff08;JavaScript的运行环境&#xff09;&#xff0c;然后再用nodejs里面的npm&#xff08;包管理和分发工具&#xff09;来安装依赖包。二.安装node.js 下载…

【办公类-22-07】周计划系列(2)“主题知识” (2024年调整版本)

作品展示 调用原来的主题知识素材&#xff0c;制作下学期的19周的主题知识word 背景需求&#xff1a; 开学了&#xff0c;继续做周计划系列&#xff0c;在原有基础上&#xff0c;进行进一步代码优化 【办公类-22-02】周计划系列&#xff08;2&#xff09;-生成“主题知识”&…

【Android】View 与 ViewGroup

View 是 Android 所有控件的基类&#xff0c;我们平常所用的 TextView 和 ImageView 都是继承自 View 的&#xff0c;源码如下&#xff1a; public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {... }public class ImageView extends View {.…

升级加薪聊绩效过程中,如果我觉得自己受到了老板“不公正”的对待,该如何“怼”回去?...

老板与员工谈绩效 今天分享的主题是「职场的向上管理」 什么是向上管理&#xff1f; 向上管理是一种有自主意识的方法 通过与你的老板在目标上达成共识&#xff0c;并最终用这个目标满足你、你的老板、你的组织的最大利益 向上管理与你的老板无关&#xff0c;老板都没得选的&am…

Java JDK 下载和配置

Java JDK 下载 下载网址&#xff1a;https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html jdk文件夹的目录介绍 bin: 主要存放的是Java的编译器、解析器等工具。 jre&#xff1a;Java runtime environment, Java 运行时环境。 jre/bin:Java平台…

RuntimeError: CUDNN_STATUS_EXECUTION_FAILED

问题描述&#xff1a; 运行代码时候报错&#xff1a; 原因&#xff1a;pytorch与cuda版本不对&#xff0c;需要重新安装。不过我在复现代码的时候一般是要求特定的环境&#xff0c;不然会有其他错误&#xff0c;所以选择其他解决办法。 解决方案&#xff1a; 在train.py开头…

【图论】【堆优化的单源路径】LCP 20. 快速公交

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 LCP 20. 快速公交 小扣打算去秋日市集&#xff0c;由于游客较多&#xff0c;小扣的移动速度受到了人流影响&#xff1a; 小扣从 x 号站点移动至 x 1 号站点需要花费的时间为 inc&#xff1b; 小扣从 x 号站…