Servlet3.0还有一个改变是改进了部分API,这种改进很好的简化了的了JAVA WEB的开发,其中一个改进就是HttpServletRequest增加了进文件上传的支持。
HttpServletRequest提供了如下两个方法来处理文件上传
1、Part getPart(String name) :根据文件名来获取文件上传域;
2、Collection<Part> getParts():获取所有的文件上传域;
每个Part对象对应一个文件上传域,该对象提供了大量的方法来访问上传文件的文件类型、大小、输入流等,并提供一个write(String file)方法将文件文件写入服务器磁盘
上传文件一定要为表单设置enctype属性为multipart/form-data:表示以二进制流的方式处理表单
文件上传页面upload.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <form action="upload" method="post" enctype="multipart/form-data">
- 文件名:<input type="text" id="name" name="name"/><br/>
- 请选择文件:<input type="file" name="file"><br/>
- <input type="submit" value="上传"/>
- </form>
- </body>
- </html>
UploadServlet.java
使用Servlet3.0特性,使用注解@WebServlet与@MultipartConfig(处理文件上传)
- package aniyo.upload.servlet;
- import java.io.File;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Collection;
- 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 3.0增加对文件上传的支持
- * @author aniyo
- * blog:http://aniyo.iteye.com
- *
- */
- @WebServlet(name="upload",urlPatterns={"/upload"})
- @MultipartConfig
- public class UploadServlet extends HttpServlet{
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
- */
- @Override
- protected void service(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html;charset=GBK");
- PrintWriter out = response.getWriter();
- //fileName用于测试在界面上自己随便输入的一个名字,自己可以根据时间或其他规则来命名
- String fileName = request.getParameter("name");
- //获取文件上传域
- Part part = request.getPart("file");
- out.println("上传文件的类型为:"+part.getContentType()+"<br/>");
- out.println("上传文件的大小为:"+part.getSize());
- //获取该文件的上传域
- Collection<String> headerNames = part.getHeaderNames();
- for(String headerName : headerNames){
- out.println(headerName+"--->"+part.getHeader(headerName)+"<br/>");
- }
- //将上传的文件写入服务器
- part.write(getServletContext().getRealPath("/uploadFiles"+File.separator+fileName));
- }
- /* (non-Javadoc)
- * @see javax.servlet.GenericServlet#destroy()
- */
- @Override
- public void destroy() {
- super.destroy();
- }
- /* (non-Javadoc)
- * @see javax.servlet.GenericServlet#init()
- */
- @Override
- public void init() throws ServletException {
- super.init();
- }
- }