十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
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" + "Upload File \n" + "\n" + "Upload File
\n" + "上传文件" + fileName+ "成功," + "可以到项目目录的F:\\下查看,保存的文件名是:"+ saveName+"
\n" + ""); } }