Java研学-Servlet3.0文件上传下载

一 文件上传

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 目录,提供两个资源包
  Java研学-Servlet3.0文件上传下载_第1张图片

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());
    }
}

你可能感兴趣的:(#,Java研学,java,开发语言)