首页 > 代码库 > commons-fileupload源码学习心得

commons-fileupload源码学习心得

commons-fileupload依赖于commons-io包。

commons-fileupload的使用方法:

  1.创建一个文件项目工厂类DiskFileItemFactory。

        DiskFileItemFactory有俩个构造方法:

1 DiskFileItemFactory() 其中sizeThreshold是默认值10kB, 文件大小不超过这个值将内容保存在内存,超过这个值会把文件保存到临时目录下,可用System.getProperty("java.io.tmpdir")获取;2 DiskFileItemFactory(int sizeThreshold, File repository)  可以指定sizeThreshold, 和文件保存到磁盘的路径。

        DiskFileItemFactory有一个属性FileCleaningTracker,设置这个属性可以用来追踪删除临时文件。当这个临时文件不再被使用时将会被立即删除,更精确的说是这个文件对象被垃圾收集器回收时,FileCleaningTracker将启动收获者线程(reaper thread)自动删除这个临时文件。FileCleaningTracker是commons-io包的工具类。  

1 FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(servletcontext);2 DiskFileItemFactory factory = new DiskFileItemFactory();3 factory.setFileCleaningTracker(fileCleaningTracker);  4 ServletContext获取的几种方法:5     Javax.servlet.http.HttpSession.getServletContext();6     Javax.servlet.jsp.PageContext.getServletContext();7     Javax.servlet.ServletConfig.getServletContext();

  2.创建一个文件处理类ServletFileUpload。

    ServletFileUpload解析上传请求request的信息,封装到FileItem类中,我们通过FileItem可以获取文件的名称、大小、文件流等信息。

1 ServletFileUpload sfu = new ServletFileUpload(factory);2   ServletFileUpload可以设置:3     headerEncoding 读取请求头信息时使用的编码4     sizeMax 单次请求所能上传的文件总大小的最大size,默认是-1,不限制大小5     fileSizeMax 单次请求所能上传的单个文件最大size,默认是-1,不限制大小6 List<FileItem> items = sfu.parseRequest(req);

 

ServletFileUpload对上传请求信息的解析流程:

  文件上传的html代码如下:

1 <form action="http://server.dom/cgi/handle" enctype="multipart/form-data" method=POST>2   What is your name? <input type=text name=submitter/>3   What files are you sending? <input type=file name=pics/>4 </form>

    浏览器传送的数据格式如下:

 1    Content-type: multipart/form-data, boundary=AaB03x 2  3   --AaB03x 4  5   content-disposition: form-data; name="field1" 6  7   Joe Blow 8  9   --AaB03x10 11   content-disposition: form-data; name="pics"; filename="file1.txt"12 13   Content-Type: text/plain14 15   ... contents of file1.txt ...16 17   --AaB03x--