首页 > 代码库 > java FileUpload 组件上传文件
java FileUpload 组件上传文件
Commons FileUpload
Apache提供的一个组件,可以很方便的让我们处理客户端上传的文件,
下载地址 http://commons.apache.org/proper/commons-fileupload/
下载commons-fileupload.jar,还有其依赖包 commons-io.jar一同下载好,导入工程
有点奇葩的是,在tomcat下已经把這个组建集成了,但是不能正常使用,其源码基本上是一样的。
正确的包名应该是這个:org.apache.commons.fileupload.
而不是org.apache.tomcat.util.http.fileupload.下面的
最简单的使用
1 protected void doPost(HttpServletRequest request, 2 HttpServletResponse response) throws ServletException, IOException { 3 4 ServletContext servletContext = this.getServletContext(); 5 6 // 指定保存文件的位置,放在WEB-INF目录下是为了保证系统的安全性 7 String savePath = servletContext.getRealPath("/WEB-INF/upload"); 8 System.out.println("savePath=" + savePath); 9 10 if (ServletFileUpload.isMultipartContent(request)) {11 12 try {13 // 创建FileItem的工厂14 DiskFileItemFactory factory = new DiskFileItemFactory();24 // 创建一个FileItem的解析器,根据前面设置好的工厂得到25 ServletFileUpload upload = new ServletFileUpload(factory);26 27 // 解析出FIleItem项,parserRequest接收的类型是28 // javax.servlet.http.HttpServletRequest29 List<FileItem> items = upload.parseRequest(request);30 31 // 遍历FileItem,检查是否为普通字符还是文件流32 for (FileItem item : items) {33 34 // 普通表单文字35 if (item.isFormField()) {36 // 表单上的name37 String name = item.getFieldName();38 // 表单上的value39 String value =http://www.mamicode.com/ item.getString();40 41 System.out.println("name=" + name42 + " ---------- value="http://www.mamicode.com/+ value);43 44 // 数据库操作。。45 } else {46 // 文件一般从网络上传后存放到数据库,而原来的文件将采用不重复的命名方案存放47 String fileName = item.getName();// 文件名,可能是带全路径的或者就是文件名48 System.out.println("上传文件全路径:" + fileName);49 fileName = fileName.substring(fileName50 .lastIndexOf("\\") + 1);// IE51 // 、Opera52 System.out.println("上传文件名:" + fileName);53 54 // 没有上传文件55 if (fileName.equals("")) {56 break;57 }58 InputStream in = item.getInputStream();59 FileOutputStream fos = new FileOutputStream(savePath60 + "\\" + fileName);61 62 byte[] b = new byte[1024];63 int len = 0;64 while ((len = in.read(b)) != -1) {65 fos.write(b, 0, len);66 }67 68 in.close();69 fos.close();70 71 }72 }73 74 } catch (FileUploadException e) {75 // TODO Auto-generated catch block76 e.printStackTrace();77 }78 79 } else {80 response.getWriter().write("no multipart/form-data submit");81 }82 }83
设置一下高级的用法:
修改默认设置,设置限制上传大小,返回当前上传进度。。
protected void doPost(HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); ServletContext servletContext = this.getServletContext(); // 指定保存文件的位置,放在WEB-INF目录下是为了保证系统的安全性 String savePath = servletContext.getRealPath("/WEB-INF/upload"); System.out.println("savePath=" + savePath); if (ServletFileUpload.isMultipartContent(request)) { try { // 创建FileItem的工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置FileItem工厂的一些属性 File repository = (File) servletContext .getAttribute("javax.servlet.context.tempdir"); // 得到用户临时文件夹 System.out.println("temp position:" + repository.getPath()); factory.setRepository(repository); // 设置临时的存储位置 factory.setSizeThreshold(1024 * 100);// 设置缓存大小为100kb,默认为10K,以字节为单位 // 创建一个FileItem的解析器,根据前面设置好的工厂得到 ServletFileUpload upload = new ServletFileUpload(factory); // 设置允许上传的最大值,超出则拒绝上传 upload.setSizeMax(1024 * 1000); // 设置上传时的进度条监听器 ProgressListener pListener = new ProgressListener() { @Override public void update(long pBytesRead, long pContentLength, int pItems) { try { response.getWriter().write( "上传第" + pItems + "文件 上传进度:" + (pBytesRead * 1.0 / pContentLength * 100) + "%<br/>"); } catch (IOException e) { e.printStackTrace(); } } }; upload.setProgressListener(pListener); // 解析出FIleItem项,parserRequest接收的类型是 // javax.servlet.http.HttpServletRequest List<FileItem> items = upload.parseRequest(request); // 遍历FileItem,检查是否为普通字符还是文件流 for (FileItem item : items) { // 普通表单文字 if (item.isFormField()) { // 表单上的name String name = item.getFieldName(); // 表单上的value String value =http://www.mamicode.com/ item.getString(); System.out.println("name=" + name + " ---------- value="http://www.mamicode.com/+ value); // 数据库操作。。 } else { // 文件一般从网络上传后存放到数据库,而原来的文件将采用不重复的命名方案存放,System.currentTime String fileName = item.getName();// 文件名,可能是带全路径的或者就是文件名 System.out.println("上传文件全路径:" + fileName); fileName = fileName.substring(fileName .lastIndexOf("\\") + 1);// IE // 、Opera System.out.println("上传文件名:" + fileName); // 没有上传文件 if (fileName.equals("")) { break; } InputStream in = item.getInputStream(); FileOutputStream fos = new FileOutputStream(savePath + "\\" + getFileName(fileName)); byte[] b = new byte[1024]; int len = 0; while ((len = in.read(b)) != -1) { fos.write(b, 0, len); } in.close(); fos.close(); } } } catch (SizeLimitExceededException e1) { response.getWriter().write("超出大小啦。。"); } catch (FileUploadException e) { response.getWriter().write("上传失败了。。"); e.printStackTrace(); } } else { response.getWriter().write("no multipart/form-data submit"); } } String getFileName(String fileName) { Date date = new Date(System.currentTimeMillis()); String result = DateFormat.getDateInstance(DateFormat.SHORT).format( date) + "_" + fileName; return result; }
首先是
ServletFileUpload.isMultipartContent(request) 判断是否带有文件数据的表单
其内部其实还是调用了request.getContentType()的方法的
ServletUpload
1 public static final boolean isMultipartContent(2 HttpServletRequest request) {3 if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {4 return false;5 }6 return FileUploadBase.isMultipartContent(new ServletRequestContext(request));7 }
FileUploadBase
1 public static final boolean isMultipartContent(RequestContext ctx) { 2 String contentType = ctx.getContentType(); 3 if (contentType == null) { 4 return false; 5 } 6 if (contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART)) { 7 return true; 8 } 9 return false;10 }
java FileUpload 组件上传文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。