一 文件上传
1 介绍
用户选择本地文件资源保存到服务器上,Servlet需要将二进制数据以文件保存到服务器磁盘中,再将磁盘路径保存到数据库中
2 项目搭建
创建web项目,并添加对应jar包(JSTL)
3 API
HttpServletRequest 方法–从请求中解析上传的文件
返回值 | 方法 | 作用 |
---|---|---|
Part | getPart(String name) | 用于获取请求中指定 name 的文件 |
Collection | getParts() | 获取请求中全部的文件 |
Part 方法:
返回值 | 方法 | 作用 |
---|---|---|
void | write(String fileName) | 直接把接收到的文件保存到磁盘中 |
void | getContentType() | 获取文件的类型 MIME |
String | getHeader(String name) | 获取请求头信息 |
long | getSize() | 获取文件的大小 |
为 Servlet 添加注解 @MultipartConfig 使用 getPart() 获取请求中指定 name 的文件到 Part 对象中,再使用 write 方法保存文件到指定目录
4 例子
① upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<h3>注册</h3>
<%--enctype="multipart/form-data"表示需要二进制数据--%>
<form action="/fileupload" method="post" enctype="multipart/form-data">
<span style="color: red">${errorMsg}</span>
<p>姓名:<input type="text" name="username"></p>
<p>头像:<input type="file" name="headImg"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
② UploadServlet
@WebServlet("/fileupload")
//文件上传注解 maxFileSize单个上传文件大小 maxRequestSize请求中数据的大小 单位都为bytes
@MultipartConfig(maxFileSize =105560)
public class RegisterServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
String username = req.getParameter("username");
//获取表单文件封装的对象
Part part = req.getPart("headImg");
//使用工具类实现上传
String filename = UploadUtil.uploadImg(req, resp, part);
System.out.println(filename);
} catch (Exception e) {
e.printStackTrace();
//上传的图片大小超过最大值给出提示
req.setAttribute("errorMsg","上传的图片太大了!");
req.getRequestDispatcher("register.jsp").forward(req,resp);
return;
}
}
}
③ 工具类
public class UploadUtil {
public static String uploadImg(HttpServletRequest req, HttpServletResponse resp,
Part part){
try {
//上传文件的类型
String contentType = part.getContentType();
if (!contentType.startsWith("image")){
//上传的不是图片,页面给出提示
req.setAttribute("errorMsg","上传文件须是图片");
req.getRequestDispatcher("register.jsp").forward(req,resp);
return null;
}
//获取文件的名称:pic.png
String fileName = part.getSubmittedFileName();
//获取源文件类型或后缀名
String type= fileName.substring(fileName.lastIndexOf("."));
String s = UUID.randomUUID().toString().replace("-","");//使用uuid生成32位随机字符
//设置新的文件名称
String newfilename=s+type;
//设置上传的目标目录地址
String path="D:\\java\\upload\\";
//将上传的文件保存到目标地址
part.write(path+newfilename);
return newfilename;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
④ 若想同时上传多张图片可修改 UploadServlet
@WebServlet("/fileupload")
@MultipartConfig(maxFileSize = 80000, maxRequestSize = 140000)
//支持文件上传的注解
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
try {
//获取表单文件封装的对象集合
Collection<Part> parts = req.getParts();
for (Part part : parts) {
//上传文件的类型
String contentType = part.getContentType();
if (contentType != null) { // input 类型是 file
// 判断上传的文件类型合法不
if(!contentType.startsWith("image/")){
req.setAttribute("errorMsg", "请上传图片");
req.getRequestDispatcher("/upload.jsp").forward(req,
resp);
return;
}
//获取文件的名称:cat.png
String fileName = part.getSubmittedFileName();
//获取源文件类型或后缀名
String type= fileName.substring(fileName.lastIndexOf("."));
String s = UUID.randomUUID().toString().replace("-","");//使用uuid生成32位随机字符
//设置新的文件名称
String newfilename=s+type;
//设置上传的目标目录地址
String path="D:\\java\\upload\\";
//将上传的文件保存到目标地址
part.write(path+newfilename);
}else { // input 类型非 file
System.out.println(req.getParameter(part.getName()));
}
}
} catch (Exception e) {
e.printStackTrace();
//上传的图片大小超过最大值给出提示
req.setAttribute("errorMsg","上传的图片太大了!");
req.getRequestDispatcher("register.jsp").forward(req,resp);
return;
}
}
}
二 文件下载
1 介绍
下载服务器资源到用户电脑中,服务器文件需放在 WEB-INF中,放在外面用户只需要拿到下载的超链接都能够下载,将文件放在 WEB-INF 下,用户不可以直接访问,须请求到 Servlet 来处理,在对应 service 方法中编写下载限制操作
2 项目搭建
web 下新建 download 目录,提供两个资源包
3 例子
download.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件下载</title>
</head>
<body>
<h3>超链接下载当文件在WEB-INF下时无效</h3>
<p><a href="/download/大黄.rar">大黄.rar</a></p>
<p><a href="/download/小黄.rar">小黄.rar</a></p>
<h3>后台servlet下载</h3>
<p><a href="/download?filename=大黄.rar">大黄.rar</a></p>
<p><a href="/download?filename=小黄.rar">小黄.rar</a></p>
</body>
</html>
DownloadServlet
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取文件名称
String filename = req.getParameter("filename");
//获取路径
String path = getServletContext().getRealPath("/WEB-INF/download/");
//设置中文转码
//String newfilename = URLEncoder.encode(filename, "utf-8");
//默认Tomcat 服务器未告知浏览器文件的名称,需手动设置响应头来告知浏览器文件名称
String newfilename =new String (filename.getBytes("UTF-8"), "ISO-8859-1");
//设置下载的文件名
resp.setHeader("content-disposition","attachment;filename="+newfilename);
//实现文件的下载
Files.copy(Paths.get(path,filename),resp.getOutputStream());
}
}