Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,这些问题将不复存在,Servlet 3.0对文件上传提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大简化上传件的操作。
一、javax.servlet.http中Part接口
public interface Part
要上传文件必须使用multipart/form-data作为request body。
版本:
Servlet 3.1 - Apache Tomcat 8.0.33
二、方法概述
方法
描述
void delete()
删除磁盘上关于此part对象的缓存文件
java.lang.String getContentType()
获取浏览器传递过来的ContentType
java.lang.String getHeader(java.lang.String name)
获取浏览器传递过来的特定的header,参数是header的名字
java.util.Collection getHeaderNames()
获取传递给这个part的所有header的名字
java.util.Collection getHeaders(java.lang.String name)
获取该name对应的所有的value
java.io.InputStream getInputStream()
获取InputStream对象,可以用于获取上传的文件的内容
java.lang.String getName()
获取对应于此part的multipart表单的名字
long getSize()
获取此part的大小,如果是上传文件的话,表示上传的文件大小
java.lang.String getSubmittedFileName()
如果此part表示上传文件的话,返回上传的文件的名字
void write(java.lang.String fileName)
一个比较方便的方法,将上传的文件写入磁盘中
三、@MultipartConfig注解
用于处理文件上传的servlet必须使用@MultipartConfig注解,@MultipartConfig注解有4个属性。
属性 | 类型 | 概述 |
---|---|---|
fileSizeThreshold | int | 文件大小阀值,当文件大小大于此值时,文件将被写入磁盘 |
location | String | 服务器端目录,服务器把客户端上传的文件默认存入此目录下 |
maxFileSize | long | 允许上传的文件的最大大小,默认是-1,表示没有限制 |
maxRequestSize | long | 限制该multipart/form-data请求的最大数据量,默认是-1,表示没有限制 |
四、处理文件上传的servlet
//此处的@MultipartConfig注解给出了文件存放的地址和允许上传的文件最大值 @MultipartConfig(location="F:/", maxFileSize = 1024*1024*20) @WebServlet(name="UploadFileTest", urlPatterns="/upload") public class UploadFileTest extends HttpServlet{ private static final long serialVersiOnUID= 1L; //使用了commons-logging和log4j来处理日志 private static Log log = LogFactory.getLog(UploadFileTest.class); //获取注解中设置的值 private static MultipartConfig cOnfig= UploadFileTest.class.getAnnotation(MultipartConfig.class); public UploadFileTest() { // TODO Auto-generated constructor stub } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); Part part = null; try{ part = request.getPart("file");//获取part用于处理上传的文件 }catch(IllegalStateException ise){ //上传的单个文件超出maxFileSize或者上传的总的数据量超出maxRequestSize时会抛出此异常 if(config.maxRequestSize() == -1L)//如果注解中没设置此项,那就是单个文件超出限制 log.error("单个文件超限"); else if(config.maxFileSize() == -1L)//如果注解中没有设置单个文件最大限制,那就是总数据量超限。 log.error("总数据量超限"); else log.error("Error"); } if(part == null) return; String fileName = part.getSubmittedFileName();//获得上传的文件名,没有判断用户没有选择文件直接提交的情况,没有判断上传文件失败的情况 log.info("contentType : " + part.getContentType()); log.info("fileName : " + fileName); log.info("fileSize : " + part.getSize()); log.info("header names :"); for(String headerName : part.getHeaderNames()) log.info(headerName + " : " + part.getHeader(headerName)); //为了避免文件重名,将时间组合到了文件名中。实际项目中可以考虑使用用户主键或者生成一个唯一的ID来组合文件名。 String saveName = System.currentTimeMillis() + fileName; part.write(saveName);//将上传的文件保存到磁盘,默认是注解中location的相对地址,也可以传入一个绝对路径 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String docType = "\n"; out.println(docType + "\n" + "\n" + "\n" + "Upload File
\n" + "上传文件" + fileName+ "成功," + "可以到项目目录的F:\\下查看,保存的文件名是:"+ saveName+"
\n" + ""); } }
五、前端html页面
选择要上传的文件: | |
servlet使用了注解的方式注册,所以不再需要使用web.xml文件。新建一个web工程,就使用这两个文件就可以部署到tomcat了,要访问的url是http://localhost:8080/UploadFileTest/UploadFile.html
总结
以上所述是小编给大家介绍的servlet3 upload上传文件实践,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!