Servlet3.0 Part和@MutipartConfig细节操作

有看过前两篇文章的已经掌握了Servlet3.0 文件上传的简单使用和文件名处理以及将文件存放到项目中的指定目录的操作方式,接下来我们来学习一些细节的操作,来看看上传文件的一些限制操作.

在做限制操作前咱们把 Part 的 API 贴出来下.@MutipartConfig 在后面讲解限制时再一一引出.

Part API

return method description
void delete() 删除Part数据和临时目录数据,默认会删除
String getContentType() 获取文件MIME类型
String getHeader(String name) 获取请求头
String getHeaderNames() 获取所有请求头名称
Collection getHeaders(String name) 获取指定header名称的集合数据
InputStream getInputStream() 获取输入流用于检索文件的内容
String getName() 获取file控件的name属性
long getSize() 上传文件的大小
String getSubmittedFileName() 获取上传文件名Servlet3.1 Tomcat8.0实现
void write(String fileName) 将文件内容写入指定的磁盘位置

指定缓存大小和临时目录

页面这咱就不累赘了(简单使用),这里的临时目录和缓存大小只需要给注解 @MutipartConfig 设置 location 和 fileSizeThreshold 即可

  • location : 指定上传文件的临时目录,默认为""
  • fileSizeThreshold: 指定缓存大小,超过会先存入临时目录,默认0

太简单了,没什么代码好贴的,就贴个头吧.

@WebServlet("/fileUpload")
@MultipartConfig(
    location="E:/temp",          // 设置临时目录,但文件操作100k会先存到该目录
    fileSizeThreshold=1024*100   // 限制文件超过100k不保存到内存直接到临时目录
    )
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
           文件上传操作...
    }
}

限制文件或请求数据大小

文件上传限制大小是很有必要的,以下我们就来看看如何限制大小,其实也很简单,只需@MutipartConfig 设置 maxFileSize 或者 maxRequestSize 就ok了

  • maxFileSize : 单个上传文件大小限制,单位:bytes
  • maxRequestSize : 显示请求中数据的大小,单位:bytes

页面

FileUploadServlet

@WebServlet("/fileUpload")
@MultipartConfig(maxFileSize = 1024 * 120, maxRequestSize = 1024 * 200)
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
            Collection parts = req.getParts();
            for (Part part : parts) {
                String contentType = part.getContentType();
                String realFileName = part.getSubmittedFileName();
                // 文件控件并且上传了文件
                if (contentType != null && realFileName != null
                        && !"".equals(realFileName.trim())) {
                    String ext = realFileName.substring(
                                            realFileName.lastIndexOf("."),
                                            realFileName.length());

                    String fileName = UUID.randomUUID().toString() + ext;
                    String realPath = getServletContext().getRealPath(
                                            "/upload/")
                                            + fileName;

                    part.write(realPath);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上传单个116k文件没有问题,上传单个136k文件后打印异常信息如下

java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field headImg exceeds its maximum permitted size of 122880 bytes.

上传两个116k文件异常信息如下

java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (236154) exceeds the configured maximum (204800)

FileSizeLimitExceededException 和 SizeLimitExceededException 都是Tomcat 的异常.无法直接捕获,处理使用IllegalStateException来接收即可.

@WebServlet("/fileUpload")
@MultipartConfig(maxFileSize = 1024 * 120, maxRequestSize = 1024 * 200)
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
           文件上传处理...
        } catch (IllegalStateException e) {
            System.out.println("文件太大");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

限制文件的类型

文件类型限制有两种情况,一种是判断MIME类型,一种是判断后缀名,接下来我们就用这两种方式来处理下文件的类型.

MIME类型处理

@WebServlet("/fileUpload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    // 允许的图片类型
    private String ALLOW_IMG_TYPE = "image/png;image/jpg;image/jpeg";

    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
            Part part = req.getPart("headImg");
            String contentType = part.getContentType();
            List allowTypes = Arrays.asList(ALLOW_IMG_TYPE.split(";"));
            // 类型在允许的范围内
            if (!isNullOrEmpty(contentType) && allowTypes.contains(contentType)) {
                part.write("E://" + part.getSubmittedFileName());
            }else{
                throw new RuntimeException("请选择正确的类型");
            }
        } catch (Exception e) {
            req.setAttribute("msg", e.getMessage());
            req.getRequestDispatcher("/upload.jsp").forward(req, resp);
        }
    }
    private boolean isNullOrEmpty(String var) {
        return var == null || "".equals(var.trim());
    }
}

后缀名

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    try {
        Part part = req.getPart("headImg");
        String fileName = part.getSubmittedFileName();
        List allowTypes = Arrays.asList(ALLOW_IMG_TYPE.split(";"));
        if (!isNullOrEmpty(fileName)) {
            String ext = fileName.substring(fileName.indexOf(".") + 1,fileName.length());
            if (allowTypes.contains(ext)) {
                part.write("E://" + part.getSubmittedFileName());
            }
        } else {
            throw new RuntimeException("请选择正确的类型");
        }
    } catch (Exception e) {
        req.setAttribute("msg", e.getMessage());
        req.getRequestDispatcher("/upload.jsp").forward(req, resp);
    }
}

以上文件类型的处理就ok了.希望对您有帮助!

你可能感兴趣的:(Servlet3.0 Part和@MutipartConfig细节操作)