Commons FileUpLoad 两种上传方式解
jopen
11年前
Commons FileUpLoad 两种上传方式解
traditional API (传统方式)
//上传路径 File file = new File("C:/upload"); //临时文件路径 File tempFile = new File("C:/uploadtemp"); if(!file.exists()) { file.mkdir(); } if(!tempFile.exists()) { tempFile.mkdir(); } //判断 request 是一个文件上传的 request //通过 ServletFileUpload 类的静态方法 isMultipartContent 来判断 if(ServletFileUpload.isMultipartContent(request)) { //用 DiskFileItemFactory 创建新的 file items (只是临时的) //DiskFileItemFactory 创建FileItem 实例,并保存其内容在<b>内存</b>或者<b>硬盘中</b> //通过一个阀值来决定这个 FileItem 实例是存放在<b>内存</b>或者<b>硬盘中</b> DiskFileItemFactory factory = new DiskFileItemFactory(); //设置阀值大小 //不设置的话,默认10k //超过这个阀值,FileItem将直接写入到磁盘 factory.setSizeThreshold(1024*10); //设置临时文件夹 //不设置,默认为系统默认Temp文件路径,调用 System.getProperty("java.io.tmpdir") 获取 //超过阀值的 FileItem 实例将存放在这个目录中 factory.setRepository(tempFile); //构造servletFileUpload 的实例,该实例提供工厂模式创建FileItem的DiskFileItemFactory实例 ServletFileUpload fileUpload = new ServletFileUpload(factory); //设置一个<b>完整的请求</b>允许的最大大小(注意是完整请求,包括非file类型的表单,比如Text类型) fileUpload.setSizeMax(10*1024*1024); //设置所允许的最大的单个上传文件大小(对应一个FileItem对象) //fileUpload.setFileSizeMax(10*1024*1024); try { //每一个FileItem 对应一个 request 请求中from表单中的 input 元素 //解析 request 请求,将request中提交的值存入List数组 List<FileItem> items = fileUpload.parseRequest(request); for(FileItem item : items) { //是不是一个文件上传组件 if(!item.isFormField()) { String name = item.getName(); System.out.println("name:" + name); System.out.println("length:" + item.getSize()); item.write(new File("C:/upload/"+name)); } else { String desc = item.getString("UTF-8"); System.out.println("文件描述:" + desc); } } } catch (Exception e) { e.printStackTrace(); } } else { throw new RuntimeException("请设置form表单的enctype属性"); }
Streaming API
//设置文件上传路径 String UploadFilePath = "d:/upload"; //限制文件大小 //通过 request.getHeader("Content-Length") 获取request 请求内容长度来限制 if(ServletFileUpload.isMultipartContent(request)) { //创建ServletFileUpload实例 ServletFileUpload upload = new ServletFileUpload(); try { //解析request 请求 并返回FileItemStream 的iterator 实例 FileItemIterator iter = upload.getItemIterator(req); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); if (item.isFormField()) { System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected."); } else { System.out.println("File field " + name + " with file name " + item.getName() + " detected."); // Process the input stream //System.out.println(Streams.asString(stream)); System.out.println("shuru:"); String filename = new Scanner(System.in).next(); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(new File("e:/upload"),"ez.zip"))); BufferedInputStream bis = new BufferedInputStream(stream); byte[] buffer = new byte[1024]; int len = -1; while (-1 != (len = bis.read(buffer))){ bos.write(buffer,0,len); } bis.close(); bos.flush(); bos.close(); PrintWriter out = resp.getWriter(); out.write("完成"); System.out.println("wanchengle "); } } } catch (FileUploadException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } else { throw new RuntimeException("请设置form表单的enctype属性"); }
两种方法对比
Streaming API 优势:速度快消耗资源少。
Streaming API 不会保存文件到硬盘或内存,它仅仅提供一个流,你可以读取它存放到硬盘。相比传统的API,避免了创建临时文件。而传统的API需要copy两次,一次是从浏览器到临时文件,一次是从临时文件到存放目录。
Streaming API 缺点: 只能限制整个 request content 的大小,不能限制一次请求中单个 FileItem 大小