servlet3.0 文件上传
来源:互联网 发布:linux解包boot.img 编辑:程序博客网 时间:2024/06/05 15:38
Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,这些问题将不复存在,Servlet 3.0对文件上传提供了直接支持,配合Servlet 3.0中基于Annotations的配置,大大简化上传件的操作。今天做了个小demo,测试了写Servlet 3.0的文件上传功能。
1.写文件上传的服务端(Servlet ),将上传文件全都保存到指定配置的目录下面,转向上传文件列表的显示页面。
Java代码 收藏代码
package com.neusoft.servlet3.demo; import java.io.IOException; import java.util.Collection; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; 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 FileUploadServlet */ @WebServlet( description = "文件上传", urlPatterns = { "/upload" } ) @MultipartConfig( location = "E:\\upload",//文件存放路径,指定的目录必须存在,否则会抛异常 maxFileSize = 8388608,//最大上传文件大小,经测试应该是字节为单位 fileSizeThreshold = 819200//当数据量大于该值时,内容将被写入文件。(specification中的解释的大概意思,不知道是不是指Buffer size),大小也是已字节单位 //maxRequestSize = 8*1024*1024*6 //针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。以字节为单位。 ) public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private String fileNameExtractorRegex = "filename=\".+\""; /** * @see HttpServlet#HttpServlet() */ public FileUploadServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { throw new UnsupportedOperationException(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<String> fileNames = new LinkedList<String>(); request.setCharacterEncoding("UTF-8"); Collection<Part> parts = request.getParts(); //遍历所有的表单内容,将表单中的文件写入上传文件目录 for (Iterator<Part> iterator = parts.iterator(); iterator.hasNext();) { Part part = iterator.next(); //从Part的content-disposition中提取上传文件的文件名 String fileName = getFileName(part); if(fileName!=null){ fileNames.add(fileName); part.write(fileName); } } request.setAttribute("fileNames", fileNames); //显示上传的文件列表 request.getRequestDispatcher("upload_files_list.jsp").forward(request, response); } /** * 从Part的Header信息中提取上传文件的文件名 * @param part * @return 上传文件的文件名,如果如果没有则返回null */ private String getFileName(Part part){ //获取header信息中的content-disposition,如果为文件,则可以从其中提取出文件名 String cotentDesc = part.getHeader("content-disposition"); String fileName = null; Pattern pattern = Pattern.compile(fileNameExtractorRegex); Matcher matcher = pattern.matcher(cotentDesc); if(matcher.find()){ fileName = matcher.group(); fileName = fileName.substring(10, fileName.length()-1); } return fileName; } }
2.上传文件jsp页面(fileupload.jsp)代码片段,enctype必须申明为multipart/form-data,否则Servlet 会抛异常!
Html代码 收藏代码
<form action="upload" method="post" enctype="multipart/form-data"> <fieldset> <label>File1:</label><input type="file" name="file1"/><br/> <label>File2:</label><input type="file" name="file2"/><br/> <label>File3:</label><input type="file" name="file3"/><br/> <label>File4:</label><input type="file" name="file4"/><br/> <label>File5:</label><input type="file" name="file5"/> </fieldset> <input type="submit" name="submit" value="upload"/> </form>
3.上传文件列表显示页面(upload_files_list.jsp)代码片段。
Html代码 收藏代码
<p>上传了${fn:length(fileNames) }几个文件 </p> <c:if test="${not empty fileNames }"> <ul> <c:forEach var="fileName" items="${fileNames }"> <li>${fileName}</li> </c:forEach> </ul> </c:if>
Servlet 3.0的文件上传功能确实好用,只等Java EE 6普及了,到时候就可以抛弃Commons-FileUpload了!不过Servlet 3.0的文件上传接口也有不足指出,比如不能直接获取上传的文件的文件名,MultipartConfig信息好像也没有提供接口直接获取,我查了好半天没找到,当然没有这些功能也有好处的,那就是带来简单易用接口……当实际有需要的时候再写点扩展的工具类就OK了。 Servlet 3.0还提供了很多其他新功能,最吸引人当然就是对异步处理的支持,有空再研究研究…… PS:Tomcat 7.0正式版已经发布了,今天使用了下,感觉对jsp的处理不怎么好,100%一样的代码我在Glassfish下完美运行,放到tomcat 7就报jsp解析异常(xml解析异常),太不稳定了,看堆栈信息是从xerces中抛出来的,估计跟xerces解析xml有关,懒得深究,还是等以后发布了4、5更新后再考虑使用吧!
阅读全文
0 0
- servlet3.0上传文件
- servlet3.0文件上传
- Servlet3.0文件上传
- servlet3.0 文件上传
- Servlet3.0的文件上传
- Servlet3.0现实文件上传
- servlet3.0多文件上传
- Servlet3.0 上传文件实例
- 【Demo】Servlet3.0 上传文件
- servlet3.0处理文件上传
- 使用Servlet3.0上传文件
- servlet3.0 part上传文件
- Servlet3.0实现上传文件到服务器端
- [Servlet3.0新特性]Serlvet文件上传
- 基于Servlet3.0的文件上传
- 基于servlet3.0的文件上传
- 文件上传之servlet3.0实现
- servlet3.0学习之文件上传
- Laravel5 内置登录注册使用教程
- 51nod 1050 循环数组的最大子段和
- springboot入门(一)
- OpenGL ES 三种类型修饰 uniform attribute varying
- 基于NotePad应用的功能扩展
- servlet3.0 文件上传
- Python 调用R
- Python如何处理大数据(知识整理)
- 《极客与团队》的读后感
- 反向传播算法介绍
- Sqoop的命令使用
- PHP and MySQL Web Development习题作业集(二)
- 2017程序员综合素质调研测试
- 内存泄漏