Servlet 的三大域对象
- request 域对象
在一次申请中无效。申请转发无效,重定向生效。
- session 域对象
在一次会话中无效。申请转发和重定向都无效,session 销毁后生效。
- servletContext 域对象
在整个应用程序中无效。服务器敞开后生效。
文件上传和下载
在上网的时候咱们经常遇到文件上传的状况,例如上传头像、上传材料等;当然除了上传,遇见下载的状况也很多,接下来看看咱们 servlet 中怎么实现文件的上传和下载。
文件上传
文件上传波及到前台页面的编写和后盾服务器端代码的编写,前台发送文件,后盾接管并保留文件,这才是一个残缺的文件上传。
前台页面
在做文件上传的时候,会有一个上传文件的界面,首先咱们须要一个表单,并且表单的申请形式为 POST;其次咱们的 form 表单的 enctype 必须设为 ”multipart/form-data”,即 enctype=”multipart/form-data”,意思是设置表单的类型为文件上传表单。默认状况下这个表单类型是 “application/x-www-form-urlencoded”, 不能用于文件上传。只有应用了 multipart/form-data 能力残缺地传递文件数据。
<!--
文件上传表单
1. 表单提交类型 method="post"
2. 表单类型 enctype="multipart/form-data"
3. 表单元素类型 文件域设置 name 属性值
-->
<form method="post" action="uploadServlet" enctype="multipart/form-data">
姓名:<input type="text" name="uname" > <br>
文件:<input type="file" name="myfile" > <br>
<button type="submit"> 提交 </button>
</form>
后盾实现
应用注解 @MultipartConfig 将一个 Servlet 标识为反对文件上传。Servlet 将 multipart/form-data 的 POST 申请封装成 Part,通过 Part 对上传的文件进行操作。
package com.xxxx.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")
@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);
}
}
文件下载
文件下载,行将服务器上的资源下载(拷贝)到本地,咱们能够通过两种形式下载。第一种是通过超链接自身的个性来下载;第二种是通过代码下载。
超链接下载
当咱们在 HTML 或 JSP 页面中应用 a 标签时,原意是心愿可能进行跳转,但当超链接遇到浏览器不辨认的资源时会主动下载;当遇见浏览器可能间接显示的资源,浏览器就会默认显示进去,比方 txt、png、jpg 等。当然咱们也能够通过 download 属性 规定浏览器进行下载。但有些浏览器并不反对。
默认下载
<!-- 当超链接遇到浏览器不辨认的资源时,会主动下载 -->
<a href="test.zip"> 超链接下载 </a>
指定 download 属性下载
<!-- 当超链接遇到浏览器辨认的资源时,默认不会下载。通过 download 属性可进行下载 -->
<a href="test.txt" download> 超链接下载 </a>
download 属性能够不写任何信息,会主动应用默认文件名。如果设置了 download 属性的值,则应用设置的值做为文件名。当用户关上浏览器点击链接的时候就会间接下载文件。
后盾实现下载
实现步骤
- 须要通过 response.setContentType 办法设置 Content-type 头字段的值,为浏览器无奈应用某种形式或激活某个程序来解决的 MIME 类型,例 如 “application/octet-stream” 或 “application/x-msdownload” 等。
- 须要通过 response.setHeader 办法设置 Content-Disposition 头的值 为 “attachment;filename= 文件名 ”
- 读取下载文件,调用 response.getOutputStream 办法向客户端写入附件内容。
package com.xxxx.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");
// 获取文件下载门路
String path = getServletContext().getRealPath("/");
// 获取要下载的文件名
String name = request.getParameter("fileName");
// 通过门路失去 file 对象
File file = new File(path + name);
// 判断 file 对象是否存在,且是否是一个标准文件
if (file.exists() && file.isFile()) {// 设置响应类型 (浏览器无奈应用某种形式或激活某个程序来解决的类型)
response.setContentType("application/x-msdownload");
// 设置头信息
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) {os.write(car, 0, len);
}
// 敞开流 开释资源
os.close();
is.close();} else {System.out.println("文件不存在,下载失败!");
}
}
}
加 VX 理解点我扫码支付
学习更多常识,请退出企鹅群:1080355292,入群暗号(33)