Commons 是Apache开放的源码组织的一个java子项目,该项目主要涉及一些开发中常用的模块,如文件上传,命令行处理,数据库连接池等。FileUpLoad就是其中的一个用于处理HTTP文件上传的子项目。Commons FileUpLoad组建具有以下几个特点:
1.使用简单:Commons FileUpLoad组件可以方便的嵌入JSP文件中,在JSP文件中仅编写少量代码就可完成文件上传功能,十分方便。
2.能够全程控制上传的内容:使用Commons FileUpLoad组件提供的对象及操作方法可以获得全部上传文件的信息,包括文件名称、类型、大小等,方便操作。
3.能够对上传文件的大小、类型进行控制:为了避免在上传过程中出现异常数据,在Commons FileUpload组件中,专门提供了相应的方法用于对上传文件进行控制。
环境准备:
在项目中引入Commons-Fileload-1.2.2.jar和Commons-io-2.4.jar架包
设置表单的enctype属性:
<form method="post" enctype="multipart/form-data">
在表单中使用Filek控件选择文件:
<input type="file" name="file"/>
注意:上传文件是from标签的method属性必须设成 "post",不能设置为"get"
表单设置好后,就可以通过Commons-FileUpload组件实现上传了,在实现上传之前,首先介绍下该组建的API。
添加完jar架包之后,在JSP文件中还需要将Commons-FileUpload组建所使用的类库导入JSP文件中,代码如下:
<%@ page import="org.apache.commeons.fileupload.*"%>
在项目中添加Commons-FileUpload组件后,再了解该组建都提供了哪些接口和类来实现文件的上传。
ServletFileUpload类的常用方法
public void setSizeMax(long sizeMax) 设置请求信息实体的最大允许的字节数
public List parseRequest(HttpServletRequest req) 解析form表单提交的数据,返回一个FileItem实例的集合
public static final boolean isMultipartContent(HttpServletRequest req) 判断请求信息是否为"multipart/form-data"类型
public void setHeaderEncoding(String encoding) 设置转换时所使用的字符集编码
Fileltem接口
public boolean isFormField() 判断FileItem对象封装的数据类型,普通表单字段返回true,文件表单字段返回false
public String getName() 获得文件上传字段中的文件名,普通表单字段返回null
public String getFieldName() 返回表单字段元素的name值
public void write(File file) 将FileItem对象中保存的主体内容保存到指定的文件中
public String getString() 将FileItem对象中保存的主体内容以一个字符串返回
public long getSize() 返回单个文件上传的字节数
FileltemFactory接口与实现类
public void setSizeThreshold(int sizThreshold) 设置内存缓存区的大小
public void setRepositoryPath(String path) 设置临时文件存放的目录
使用Commons FileUpload组件实现文件上传
from表单代码:
<form action="fileupload/UpLoad" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="uname"/> 上传:<input type="file" name="file"/> <input type="submit" /> </form>
Servlet模版中的代码
package fileupload; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.activation.FileDataSource; import javax.servlet.ServletContextEvent; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UpLoad extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //乱码处理 request.setCharacterEncoding("utf-8"); //上传 FileItemFactory factory = new DiskFileItemFactory(); //工具 依赖一个工厂 ServletFileUpload upload = new ServletFileUpload(factory); try { //根据请求拆解出一个FileItem集合 一个FileItem对应前台的一个表单字段 List<FileItem> list = upload.parseRequest(request); //一个item就是一个表单字段 for (FileItem item : list) { //普通表单字段 if(item.isFormField()){ if(item.getFieldName().equals("uname")){ String uname = item.getString("utf-8"); request.setAttribute("uname",uname); } }else{ //文件域字段 String filename = item.getName(); //在servlet中获取application对象 String leftpath = getServletContext().getRealPath("/WEB-INF/upload"); File file = new File(leftpath,filename); item.write(file); System.out.println("write ok!"); } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
文件上传成功!
需要去安装Tomcat的本地路径去查看上传的文件