Commons-FileUpload上传组件
官方资源主页http://jakarta.apache.org/commons/fileupload/index.html
FileUpload组件解决了常见的文件上载问题。它提供了一个易用的接口来管理上载到服务器的文件,可用于JSP和 Servlet之中。FileUpload组件遵从RFC1867,它分析输入请求,向应用程序提供一系列上载到服务器的文件。上载的文件可以保留在内存中,也可以放入一个临时位置(允许配置一个表示文件大小的参数,如果上载的文件超过了该参数指定的大小,则把文件写入一个临时位置)。另外还有一些参数可供配置,包括可接受的最大文件、临时文件的位置等。
下面介绍一下使用FileUpload组件的步骤。
首先创建一个HTML页面。注意,凡是要上载文件的表单都必须设置enctype属性,且属性的值必须是multipart/form-data,同时请求方法必须是POST。下面的表单除了上载两个文件,另外还有一个普通的文本输入框:
代码内容 <form name="myform" action="fileuploaddemo.jsp" method="post" enctype="multipart/form-data"> 输入你的名字:<br /> <input type="text" name="name" size="15"/><br /> 图形:<br /> <input type="file" name="myimage"><br/> 文件:<br /> <input type="file" name="myfile"><br /><br /> <input type="submit" name="Submit" value="Submit your files"/> |
代码内容 // … // ① 检查输入请求是否为multipart的表单数据。 boolean isMultipart = FileUpload. isMultipartContent(request); // … // ② 为该请求创建一个句柄,通过它来解析请求。执行 // 解析后,所有的表单项目都保存在一个List中。 DiskFileUpload upload = new DiskFileUpload(); // 通过句柄解析请求,解析得到的项目保存在一个List中 List items = upload.parseRequest(request); // … // ③ 通过循环依次获得List里面的文件项目。要区分表示 // 文件的项目和普通的表单输入项目,使用isFormField() // 方法。根据处理请求的要求,我们可以保存上载的文 // 件,或者一个字节一个字节地处理文件内容,或者打 // 开文件的输入流。 Iterator itr = items.iterator(); while(itr.hasNext()) { FileItem item = (FileItem) itr.next(); // 检查当前的项目是普通的表单元素,还是一个上载的文件 if(item.isFormField()) { // 获得表单域的名字 String fieldName = item.getFieldName(); // 如果表单域的名字是name… if(fieldName.equals("name")) request.setAttribute("msg", "Thank You: " + item.getString()); } else { // 该项目是一个上载的文件,把它保存到磁盘。 // 注意item.getName() // 会返回上载文件在客户端的完整路径名称,这似乎是一个BUG。 // 为解决这个问题,这里使用了fullFile.getName()。 File fullFile = new File(item.getName()); File savedFile = new File (getServletContext().getRealPath("/"), fullFile.getName()); item.write(savedFile); } } |
还有其他一些略有变化的使用形式,正如前面所指出的,我们可以在上载的文件上打开一个输入流,或者让它们驻留在内存中直至空间占用达到一定的限制值,或者在判断文件类型的基础上,以String或Byte数组的形式获取其内容,或者直接删除文件。这一切都只要使用FileItem类提供的方法就可以方便地做到(DefaultFileItem是FileItem的一个实现)。