一.本次笔记小目标
掌握Cookie的使用,理解常用对象的作用和意义
掌握域对象的设置与获取
理解文件上传的步骤
握文件下载
二.Cookie
1. Cookie 的创建和发送
通过 new Cookie(“key”,”value”);来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中, resp.addCookie(cookie);此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见。
如果服务器端发送重复的 Cookie 那么会覆盖原有的 Cookie。
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie的创建和发送
* @author Lisa Li
*
*/
@SuppressWarnings("serial")
public class Cookie01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie = new Cookie("user", "shsxt-123456");
// 发送给客户端
resp.addCookie(cookie);
// 创建Cookie对象
Cookie cookie1 = new Cookie("A", "a");
// 发送给客户端
resp.addCookie(cookie1);
// 如果cookie的name值一眼,后面的cookie对象会将前面的cookie对象覆盖
// 创建Cookie对象
Cookie cookie2 = new Cookie("A", "aa");
// 发送给客户端
resp.addCookie(cookie2);
}
}
2. Cookie 的获取
在服务器端只提供了一个 getCookies()的方法用来获取客户端回传的所有cookie 组成的一个数组,如果需要获取单个 cookie 则需要通过遍历, getName()获取 Cookie 的名称, getValue()获取 Cookie 的值。
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie的获取
* @author Lisa Li
*
*/
@SuppressWarnings("serial")
public class Cookie02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取cookie数组
Cookie[] cookies = req.getCookies();
// 判断数组否是否为空
if (cookies != null &&cookies.length >0) {
// 遍历数组
for (Cookie cookie : cookies) {
// 判断是否是指定的cookie
if ("user".equals(cookie.getName())) {
// 得到cookie对应的value
System.out.println(cookie.getValue());
}
}
}
}
}
3. Cookie 到期时间的设定
到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(inttime);方法设定 cookie 的最大有效时间,以秒为单位。
a.负整数:
cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。
b.正整数:
表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑, cookie 也会存活相应的时间。
c.零:
cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的setMaxAge(0)来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie的过期时间的设定
* @author Lisa Li
*
*/
@SuppressWarnings("serial")
public class Cookie03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建Cookie对象
Cookie cookie = new Cookie("B", "bb");
// 设定cookie的失效时间
/*
* maxAge的取值:单位秒
* 负整数:代表关闭浏览器cookie失效,默认值
* 正整数:代表cookie在浏览器中存活指定秒数
* 0:代表删除cookie,即刻删除
*/
// cookie.setMaxAge(-1);
// cookie.setMaxAge(30);
// cookie.setMaxAge(0);
// 设置3天失效
cookie.setMaxAge(3 * 24 * 60 * 60);
// 响应给浏览器
resp.addCookie(cookie);
Cookie cookie2 = new Cookie("A", null);
cookie2.setMaxAge(0); // 删除cookie
resp.addCookie(cookie2);
}
}
4. Cookie 的注意
a.在一般的站点中常常有记住用户名这样一个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无效了。而且 cookie 还不能跨浏览器。
b.Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码。
package com.shsxt.web;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie的注意
* 1、Cookie不能跨浏览器(不跨电脑)
* 2、Cookie不能储存中文
* 如果一定要存中文,需要编码
* 如果直接存中文
* java.lang.IllegalArgumentException: Cookie name "姓名" is a reserved token
* 3、Cookie的覆盖
* 如果服务器端发送name属性值相同的 Cookie 那么会覆盖原有的 Cookie。
* 除了value和maxAge的值被改变的情况下回覆盖,其他的(path、domain)都会重新创建一个cookie对象,
* @author Lisa Li
*
*/
@SuppressWarnings("serial")
public class Cookie04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 定义name和value
String name = "姓名";
String value = "张三";
// 将中文编码
name = URLEncoder.encode(name, "UTF-8");
value = URLEncoder.encode(value, "UTF-8");
// 创建Cookie对象
Cookie cookie = new Cookie(name, value);
// 响应给浏览器
resp.addCookie(cookie);
}
}
5. Cookie 的路径
a.在 Servlet 中保存的 Cookie 如果没有设置 path,那么它的 path 默认为当前 Servlet 的所在路径;
b.当访问的路径包含了 cookie 的路径时,则该请求将带上该 cookie;如果访问路径不包含 cookie 路径,则该请求不会携带该 cookie;
三.Session
1.前奏
HttpSession 对象是 javax.servlet.http.HttpSession 的实例,该接口并不像HttpServletRequest 或 HttpServletResponse 还存在一个父接口,该接口只是一个纯粹的接口。 这因为 session 本身就属于 HTTP 协议的范畴。在整个 session 中,最重要的就是属性的操作。
2. Session 的作用
Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。我们可以通过 req.getSession()方法,来获取当前会话的 session 对象。
3. 标识会话 JSESSIONID
Session 既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是 sessionId。Session 的底层依赖 Cookie 来实现。
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
public class Session01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 创建或获取session对象(当session对象不存在时,创建新的session对象;如果存在,获取该session对象)
HttpSession session = req.getSession();
// 获取session的标识符
String sessionId = session.getId();
System.out.println("获取sesion的标识符: " + sessionId);
// 第一次访问的时间(创建时间)
long createTime = session.getCreationTime();
System.out.println("创建时间: " + createTime);
// 最后访问的时间
long lastTime = session.getLastAccessedTime();
System.out.println("最后访问的时间: " + lastTime);
// 当前是否是新的session对象
boolean flag = session.isNew();
System.out.println("当前是否是新的session对象: " + flag);
HttpSession session2 = req.getSession();
// 获取session的标识符
String sessionId2 = session2.getId();
System.out.println("获取sesion的标识符2: " + sessionId2);
// 第一次访问的时间(创建时间)
long createTime2 = session2.getCreationTime();
System.out.println("创建时间2: " + createTime2);
// 最后访问的时间
long lastTime2 = session2.getLastAccessedTime();
System.out.println("最后访问的时间2: " + lastTime2);
// 当前是否是新的session对象
boolean flag2 = session2.isNew();
System.out.println("当前是否是新的session对象2: " + flag2);
}
}
4. 作为域对象
Session 用来表示一次会话,在一次会话中数据是可以共享的,这时 session作为域对象存在,可以通过 setAttribute(name,value);方法向域对象中添加数据,通过 getAttribute(name) 从域对象中获取数据,通过 removeAttribute(name)从域对象中移除数据。
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
public class Session02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 存request作用域
req.setAttribute("uname", "zhangsan");
// 存session作用域
HttpSession session = req.getSession();
System.out.println(session.getId());
session.setAttribute("name", "admin");
// 请求转发 request作用域有效,session作用域有效
// req.getRequestDispatcher("s03").forward(req, resp);
// 重定向 request作用域失效,session作用域有效
resp.sendRedirect("s03");
}
}
5. Session 的销毁
a.默认时间到期
当客户端第一次请求 servlet 并且操作 session 时, session 对象生成,Tomcat 中 session 默认的存活时间为 30min,即你不操作界面的时间,一旦有操作, session 会重新计时。可以在 Tomcat 中的 web.xml 文件中进行修改。 如下图:
b.自己设定到期时间
当然除了以上的修改方式外,我们也可以在程序中自己设定 session 的生命周期,通过 session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。
c.立刻失效
或者我们也可以通过 session.invalidate();方法让 session 立刻失效
d.关闭浏览器
从前面的 JESSION 可知道, session 的底层依赖 cookie 实现,并且该 cookie的有效时间为关闭浏览器, 从而 session 在浏览器关闭时也相当于失效了(因为没有 JSESSIONID 再与之对应)。
e.关闭服务器
当非正常关闭服务器时, session 销毁;当正常关闭服务器时, Session 将被序列化到磁盘上,在工作空间 work 目录下的 SESSION.ser 文件中,下次启动服务时,自动加载到内存。
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
public class Session04 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Session的销毁
/**
* 1、达到最大沉默时间(达到服服务器默认的设置时间,默认30min,可以在Tomcat下的web.xml中修改session-timeout)
* 2、手动设置到期时间 session.setMaxInactiveInterval(int); 单位秒,允许最大的不活动时间
* 3、立即失效、销毁session session.invalidate();
* 4、关闭浏览器 session 的底层依赖 cookie 实现,并且该 cookie的有效时间为关闭浏览器
* 5、当非正常关闭服务器时, session 销毁;当正常关闭服务器时, Session 将被序列化到磁盘上,在工作空间 work 目录下的 SESSION.ser 文件中,下次启动服务时,自动加载到内存。
*/
HttpSession session = req.getSession();
System.out.println(session.getId());
// 设置最大不活动时间为10秒
session.setMaxInactiveInterval(100);
// 销毁session对象
// session.invalidate();
}
}
四.ServletContext 对象
1. ServletContext 对象的获取
a.获取 ServletContext 对象的途径有很多例如通过 request 对象可以
b.通过 session 可以
c.通过 servletConfig 可以,在 Servlet 标准中提供了获取 ServletConfig 的方法
d.本身 Servlet 标准后期的实现类中也提供了直接获取 ServletContext 的方法(常用)
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取servletContext对象的四种方式
// 通过request对象获取
ServletContext servletContext = req.getServletContext();
// 通过session对象获取
ServletContext servletContext2 = req.getSession().getServletContext();
// 通过servletConfig对象获取
ServletContext servletContext3 = getServletConfig().getServletContext();
// 直接得到
ServletContext servletContext4 = getServletContext();
// 获取服务器的版本
String serverInfo = servletContext.getServerInfo();
System.out.println("获取服务器的版本: " + serverInfo);
// 获取资源在服务器上的真实路径
String realPath = servletContext.getRealPath("/");
System.out.println("获取资源在服务器上的真实路径: " + realPath);
}
}
2. 作为域对象
ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数据。当然不建议存放过多数据,因为ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。
Servlet02
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
public class Servlet02 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 存request作用域
req.setAttribute("uname", "zhangsan");
// 存session作用域
HttpSession session = req.getSession();
System.out.println(session.getId());
session.setAttribute("name", "admin");
// 存servletContext作用域
ServletContext context = getServletContext();
context.setAttribute("userName", "lisi");
// 请求转发 request作用域有效,session作用域有效
//req.getRequestDispatcher("s03").forward(req, resp);
// 重定向 request作用域失效,session作用域有效
resp.sendRedirect("s03");
}
}
Servlet03
package com.shsxt.web;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@SuppressWarnings("serial")
public class Servlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取request作用域中的值
String uname = (String) req.getAttribute("uname");
System.out.println("uname: " + uname);
// 获取session作用域中的值
HttpSession session = req.getSession();
System.out.println("SessionID:" + session.getId());
String name = (String) session.getAttribute("name");
System.out.println("name: " + name);
// 获取servletContext的作用域
ServletContext servletContext = getServletContext();
String userName = (String) servletContext.getAttribute("userName");
System.out.println("userName:" + userName);
}
}
五.文件上传下载
1. 文件上传
文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收 并保存文件,这才是一个完整的文件上传。
a.前台页面
在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并且表单的 请求方式为 POST;其次我们的 form 表单的 enctype 必须设为 ”multipart/form-data” 即 enctype="multipart/form-data" 意 思 是 设 置 表 单 的MIME 编码。默认情况下这个编码格式 是 ”application/x-www-form-urlencoded”,不能用于文件上传;只有使用了 multipart/form-data 才能完整地传递文件数据。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<!--
超链接下载
能够被浏览器识别的资源,则直接显示
不能被识别,则会被下载
download属性
指定超链接可以下载资源(无论资源是否能够被浏览器识别)
默认下载的名称是文件名称,如需修改文件名,则设置download的属性值即可
-->
<a href="service.jpg">图片</a><br>
<a href="test.txt">TXT</a><br>
<a href="test.exe">exe</a><br>
<hr><br>
<a href="service.jpg" download>图片下载</a><br>
<a href="service.jpg" download="a.jpg">图片下载</a><br>
<hr><br>
<form action="download" method="post">
文件名:<input type="text" name="fileName" />
<input type="submit" value="下载"/>
</form>
</body>
</html>
b.后台 commons-fileupload 的使用
首先需要导入第三方 jar 包, http://commons.apache.org/ 下 载commons-io 和 commons-fileupload 两个 jar 的资源。解压并导入到项目中。commons-fileupload.jar 是文件上传的核心包 commons-io.jar 是 filefupload 的依赖包,同时又是一个工具包。
步骤:
1、 创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
2、 创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
3、 通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
4、 遍历集合中的各个元素并处理
5、 判断每个元素是否是普通表单项,如果是则按照普通表单项处理
6、 如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)
package com.shsxt.web;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 文件下载
*/
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* Step1:
* 需要通过 HttpServletResponse.setContentType 方法设置 Content-type头字段的值, 为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,
例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等
Step2:
需要通过 HttpServletResponse.setHeader 方法设置Content-Disposition 头的值 为”attachment;filename=文件名 ”
Step3:
读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回的 OutputStream 对象来向客户端写入附件内容。
*/
// 设置请求的编码
request.setCharacterEncoding("UTF-8");
// 设置响应的编码
response.setContentType("text/html;charset=UTF-8");
// 得到参数,得到需要下载的文件名
String fileName = request.getParameter("fileName");
// 判断文件名是否为空
if (fileName == null || fileName.length() < 1) {
// 得到输出流
PrintWriter out = response.getWriter();
out.write("<h1>请输入要下载的文件名!</h1><h3><a href='download.html'>返回</a></h3>");
out.close();
return;
}
// 得到资源的真实路径
String realPath = getServletContext().getRealPath("/upload/");
// 得到被下载的文件的存放路径
String filePath = realPath + fileName;
// 通过路径得到file对象
File file = new File(filePath);
// 判断被下载的文件是否存在,并且是一个标准文件
if (file.exists() && file.isFile()) {
// 设置响应类型
response.setContentType("application/x-msdownload");
// 设置下载的弹出框信息
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 得到输入流
InputStream in = new FileInputStream(file);
// 得到字节输出流
ServletOutputStream out = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0;
while((len = in.read(bytes)) != -1) {
out.write(bytes,0,len);
}
// 关闭流
out.close();
in.close();
} else {
// 得到输出流
PrintWriter out = response.getWriter();
out.write("<h1>文件不存在!</h1><h3><a href='download.html'>返回</a></h3>");
out.close();
}
}
}
2. 文件下载
文件下载即将服务器上的资源下载(拷贝)到本地,我们可以通过两种方式下载。第一种是通过超链接本身的特性来下载;第二种是通过手动写出来下载
a.超链接下载
当我们在 HTML 或 JSP 页面中使用标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的动态网页时则会自动下载。
b.后台实现下载
Step1:
需要通过 HttpServletResponse.setContentType 方法设置 Content-type头字段的值, 为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等
Step2:
需要通过 HttpServletResponse.setHeader 方法设置Content-Disposition 头的值 为”attachment;filename=文件名”
Step3:
读取下载文件,调用 HttpServletResponse.getOutputStream 方法返回的 OutputStream 对象来向客户端写入附件内容。
前端代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!--
如果是文件上传表单
1、必须设置enctype="multipart/form-data",设置MIME编码
2、请求方式为POST
3、文件域需要设置name属性值
-->
<form action="upload" method="post" enctype="multipart/form-data">
用戶名:<input type="text" name="uname" />
文件名:<input type="file" name="myfile" />
<input type="submit" />
</form>
</body>
</html>
后端代码:
package com.shsxt.web;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个工具类
ServletFileUpload – 文件上传的核心类,此类接收 request,并解析
ServletFileUpload.parseRequest(request); – List 解析 request
1、 创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
2、 创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
3、 通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
4、 遍历集合中的各个元素并处理
5、 判断每个元素是否是普通表单项,如果是则按照普通表单项处理
6、 如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设定编码,可以获取中文文件名
request.setCharacterEncoding("UTF-8");
// 获取tomcat下的upload目录的路径
String path = getServletContext().getRealPath("/upload");
// 临时文件目录
String tempPath = getServletContext().getRealPath("/temp");
// 检查我们是否有文件上传请求
// boolean isMultipart = ServletFileUpload.isMultipartContent( req);
// 1、声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录
DiskFileItemFactory disk = new DiskFileItemFactory(1024 * 10, new File(tempPath));
// 2、声明ServletFileUpload,接收上面的临时文件。也可以默认值
ServletFileUpload up = new ServletFileUpload(disk);
// 3、解析request
try {
List<FileItem> list = up.parseRequest(request);
if (list.size() > 0) {
for (FileItem file : list)
// 判断是否是普通的表单项
if (file.isFormField()) {
String fieldName = file.getFieldName();
// 中文乱码,此时还需要指定获取数据的编码方式
// String value = file.getString();
String value = file.getString("UTF-8");
System.out.println(fieldName + "=" + value);
} else { // 说明是一个文件
// 获取文件本身的名称
String fileName = file.getName();
System.out.println(file.getFieldName());
// 处理文件名称
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
System.out.println("old Name : " + fileName);
// 修改名称
String extName = fileName.substring(fileName.lastIndexOf("."));
String newName = UUID.randomUUID().toString().replace("-", "") + extName;
// 保存新的名称,并写出到新文件中
file.write(new File(path + "/" + newName));
System.out.println("文件名是: " + fileName);
System.out.println("文件大小是: " + file.getSize());
file.delete();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}