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

在之前的内容中我们终于结束了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中进行文件上传下载操作的方法,为我们最终完成一个系统提供了重要的理论知识。下一节中我们会讲解Servlet的左膀右臂——过滤器和监听器

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编程游戏是一种非常有趣和创造性的活动,其中创造者使用汤米科学基金会的Scratch项目创作自己的游戏。Scratch是一个基于块编程的语言,它允许用户通过拖放代码块来完成编程任务。 假设我创建了一个名为"快乐太空飞行"的游戏。在这个游戏中,玩家需要控制一个宇航员穿过太空中的各种障碍物,如陨石、卫星和飞船。 玩家可以使用键盘上的箭头键来移动宇航员,同时避开障碍物。如果宇航员成功通过了一系列的关卡,他们将进入下一个更具挑战性的关卡。 在这个游戏中,我还添加了一些额外的功能来增加乐趣和挑战。例如,通过收集星星,玩家可以获得额外的生命或能量,以应对更困难的关卡。此外,玩家还可以在游戏中设置个人目标,例如在特定时间内通过关卡,以提高游戏的可玩性。 编程游戏不仅有助于提高创造力和逻辑思维能力,还可以培养解决问题和团队合作的能力。它可以帮助玩家学习基本的计算机科学概念,如循环、条件和变量等。因此,这种游戏不仅有趣,还具有教育意义。 总之,通过使用Scratch,我创建了一个名为"快乐太空飞行"的编程游戏。它不仅可以帮助玩家提高编程技能,还可以提供娱乐和挑战。这样的游戏不仅有助于培养创造力和逻辑思维能力,还可以帮助玩家了解计算机科学的基本概念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤米尼克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值