Multipartconfig注解具有以下属性:
fileSizeThreshold: 我们可以指定大小的阈值后,该文件将被写入磁盘。大小值是字节,所以1024 * 1024 * 10是MB。
location: 文件将被存储在目录默认路径下,它的默认值是“”。
maxFileSize: 最大允许上传文件的大小,它的值是以字节形式提供的。它的默认值是-1L意味着无限的。
maxRequestSize: 允许的最大值为multipart/form-data的请求。默认值为-1L,意味着无限的。
@MultipartConfig(fileSizeThreshold=1024*1024*10, // 10 MB maxFileSize=1024*1024*50, // 50 MB maxRequestSize=1024*1024*100) // 100 MB在线API文档:
http://docs.Oracle.com/javaee/6/api/javax/servlet/http/Part.html
常用方法:
void delete() //删除文件项的基础存储,包括删除任何相关的临时磁盘文件。java.util.Collection<java.lang.String> getHeaderNames() //获取此部分的标头名称。java.util.Collection<java.lang.String> getHeaders(java.lang.String name) //获取给定名称的部分标头的值。java.io.InputStream getInputStream() //获取标头内容的输入流java.lang.String getName() //获取此部分的名称。long getSize() //返回该文件的大小。void write(java.lang.String fileName) //将上传文件写入到磁盘方便的方法JavaEE 7新增了一个方法:
String getSubmittedFileName() //获取由客户端指定的文件名upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>上传图片</title></head><body><div> <p>请选择上传需要上传的文件</p> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="filename"/><br /> <button type="submit" >提交</button> </form> <p>${ msg}</p></div></body></html>UploadServlet.java
import java.io.IOException;import java.util.UUID;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;/** * Servlet implementation class UploadServlet */@WebServlet("/UploadServlet")@MultipartConfig(location="f://") //指定文件保存在F://目录下public class UploadServlet extends HttpServlet { PRivate static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public UploadServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //拿到请求的part部件 Part part = request.getPart("filename"); String disposition = part.getHeader("content-disposition"); //截取到文件的名字 String name = disposition.substring(disposition.lastIndexOf("//") + 1, disposition.lastIndexOf(".")); //截取到文件名的后缀 String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf(".")); //随机生成一个UUID String uuid = UUID.randomUUID().toString(); //保存到f://目录下 part.write(uuid + name + suffix); request.setAttribute("msg", "上传成功!"); request.getRequestDispatcher("upload.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}选择一张图片上传
上传成功后保存在F:盘下
upload.jsp
这时候要添加多个input标签
<div> <p>请选择上传需要上传的文件</p> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="filename"/><br /> <input type="file" name="filename"/><br /> <input type="file" name="filename"/><br /> <button type="submit" >提交</button> </form> <p>${ msg}</p></div>UploadServlet.java
import java.io.IOException;import java.util.UUID;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;/** * Servlet implementation class UploadServlet */@WebServlet("/UploadServlet")@MultipartConfig(location="f://") //指定文件保存在F://目录下public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public UploadServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //遍历所有的part部件 for (Part part : request.getParts()) { String disposition = part.getHeader("content-disposition"); //截取到文件的名字 String name = disposition.substring(disposition.lastIndexOf("//") + 1, disposition.lastIndexOf(".")); //截取到文件名的后缀 String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf(".")); //随机生成一个UUID String uuid = UUID.randomUUID().toString(); part.write(uuid + name + suffix); request.setAttribute("msg", "上传成功!"); } request.getRequestDispatcher("upload.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}选择3个文件同时上传
上传成功后保存在F:盘下
刚刚已经演示过上传多个文件,在三个input框中都选择了需要上传的文件,测试时是可以正常上传的。
但是如果在上传多个文件的时候,故意有一个input框未选择文件会发什么呢?
点击提交的时候就会报错:
原因是因为
在截取文件名的时候找不到最后一个“/”form-data; name="filename"; filename=""这时需要改造一下代码,加一些逻辑判断
//遍历所有的part部件for (Part part : request.getParts()) { //如果表单文件名不为空,才执行下列操作 if(!part.getSubmittedFileName().equals("")){ String disposition = part.getHeader("content-disposition"); System.out.println(disposition); //截取到文件的名字 String name = disposition.substring(disposition.lastIndexOf("//") + 1, disposition.lastIndexOf(".")); //截取到文件名的后缀 String suffix = part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf(".")); //随机生成一个UUID String uuid = UUID.randomUUID().toString(); part.write(uuid + name + suffix); request.setAttribute("msg", "上传成功!"); }}再次提交单个文件的时候就不会出现异常了
上传成功后保存在F:盘下
新闻热点
疑难解答