[JAVAWEB实战篇]---在Servlet中使用开源fileupload包实现文件上传功能
2013-07-23 20:27
911 查看
转载:/article/4441232.html
当我们在 HTML 表单中选择本地文件之后点击“提交”按钮则会将文件上传到服务器中,此时该 HTTP 请求正文的数据类型就是 multipart/form-data 型的。而在 Servlet 技术中,该 HTTP 请求会被 Servlet 容器(如 Tomcat)包装成 HttpServletRequest 对象,再由端所请求的相应 Servlet 进行处理。
但是,如果此时我们在服务器端编写的 Servlet 一点点地解析这个 HTTP 请求,分离出其中的文本表单和上传的文件类型,这未免有点低效。于是,我们可以使用 Apache 开源上传软件包 fileupload 来简化这一过程,直接使用即可。下载地址:http://commons.apache.org/fileupload/
在 fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求(即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件;而 ServletFileUpload 对象的创建需要依赖于 FileItemFactory 工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。
呼…把这个 fileupload 包中的关系讲得那么乱,最好还是自己看下载下来的帮助文档。不过,推荐一个免费的 Java 反编译器 JD-GUI ,用它能够很轻松地打开 .jar 文件,除了源代码中的注释,其他的一览无遗,很好用啊。下载地址:http://java.decompiler.free.fr/?q=jdgui
好吧,我们的程序要求:
1、提供一个 HTML 文件,用户可在相应表单中选择需要上传的文件;
2、编写一个名叫 UploadServlet 的Servlet 文件,主要功能是解析上面 HTML 表单所提交的 HTTP 请求,把普通的文本域和文件域分离开来;
3、UploadServlet 根据 web.xml 配置文件中的初始化参数确定好需要在 Web 服务器存放该文件的目录,将上传的文件写入到该存放目录中,在我的这里我把上传的文件保存到 F:\java\JavaWeb\ch05\uploadFile 目录中,而 F:\java\JavaWeb\ch05\temp 目录则用作该 Web 应用的临时目录。
程序代码:
upload.html 文件
UploadServlet.java 文件
程序运行过程截图:(在 web.xml 文件中我们把UploadServlet 映射为 upload)
1、启动 Tomcat ,在浏览器输入 URL 并填写 HTML 表单,如下:
2、点击“上传”,发出一个包含了上传文件的复杂 HTTP 请求,由 UploadServlet 进行处理:
先看下 Tomcat 的控制台输出信息:
再看一下浏览器的相应输出:
最后看上传的文件是否被被保存在指定的目录中:
嗯,文件目录和文件保存时间都正确,就是文件大小忘了转化一下…(*^__^*) …
小结:
1、使用开源的 fileupload 包为我们在 UploadServlet 代码中显式地用繁杂的 request.getParameter(“username”) 语句来获取 HTTP 请求所包含的表单值;
2、而且还省去了我们在 UploadServlet 中自己编写判断表单是否是文件或文本类型的代码;
3、更重要的是,FileItem 对象的响应方法可以使得我们轻松地获取文件名、文件大小、路径等等;
4、最重要的是,使用 JD-GUI 反编译器简单地看看开源的 fileupload 包中的类组织结构,这更加有意思、有用处,:-D
当我们在 HTML 表单中选择本地文件之后点击“提交”按钮则会将文件上传到服务器中,此时该 HTTP 请求正文的数据类型就是 multipart/form-data 型的。而在 Servlet 技术中,该 HTTP 请求会被 Servlet 容器(如 Tomcat)包装成 HttpServletRequest 对象,再由端所请求的相应 Servlet 进行处理。
但是,如果此时我们在服务器端编写的 Servlet 一点点地解析这个 HTTP 请求,分离出其中的文本表单和上传的文件类型,这未免有点低效。于是,我们可以使用 Apache 开源上传软件包 fileupload 来简化这一过程,直接使用即可。下载地址:http://commons.apache.org/fileupload/
在 fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求(即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件;而 ServletFileUpload 对象的创建需要依赖于 FileItemFactory 工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。
呼…把这个 fileupload 包中的关系讲得那么乱,最好还是自己看下载下来的帮助文档。不过,推荐一个免费的 Java 反编译器 JD-GUI ,用它能够很轻松地打开 .jar 文件,除了源代码中的注释,其他的一览无遗,很好用啊。下载地址:http://java.decompiler.free.fr/?q=jdgui
好吧,我们的程序要求:
1、提供一个 HTML 文件,用户可在相应表单中选择需要上传的文件;
2、编写一个名叫 UploadServlet 的Servlet 文件,主要功能是解析上面 HTML 表单所提交的 HTTP 请求,把普通的文本域和文件域分离开来;
3、UploadServlet 根据 web.xml 配置文件中的初始化参数确定好需要在 Web 服务器存放该文件的目录,将上传的文件写入到该存放目录中,在我的这里我把上传的文件保存到 F:\java\JavaWeb\ch05\uploadFile 目录中,而 F:\java\JavaWeb\ch05\temp 目录则用作该 Web 应用的临时目录。
程序代码:
upload.html 文件
<html> <head> <title>Servlet 上传文件</title></head> <body > <form name="uploadForm" method="POST" enctype="MULTIPART/FORM-DATA" action="upload"> User Name:<input type="text" name="username" size="30"/> Upload File1:<input type="file" name="file1" size="30"/> Upload File2:<input type="file" name="file2" size="30"/> <input type="submit" name="submit" value="上传"> <input type="reset" name="reset" value="重置"> </form> </body> </html>
UploadServlet.java 文件
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.*; // Servlet 文件上传 public class UploadServlet extends HttpServlet { private String filePath; // 文件存放目录 private String tempPath; // 临时文件目录 // 初始化 public void init(ServletConfig config) throws ServletException { super.init(config); // 从配置文件中获得初始化参数 filePath = config.getInitParameter("filepath"); tempPath = config.getInitParameter("temppath"); ServletContext context = getServletContext(); filePath = context.getRealPath(filePath); tempPath = context.getRealPath(tempPath); System.out.println("文件存放目录、临时文件目录准备完毕 ..."); } // doPost public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/plain;charset=gbk"); PrintWriter pw = res.getWriter(); try{ DiskFileItemFactory diskFactory = new DiskFileItemFactory(); // threshold 极限、临界值,即硬盘缓存 1M diskFactory.setSizeThreshold(4 * 1024); // repository 贮藏室,即临时文件目录 diskFactory.setRepository(new File(tempPath)); ServletFileUpload upload = new ServletFileUpload(diskFactory); // 设置允许上传的最大文件大小 4M upload.setSizeMax(4 * 1024 * 1024); // 解析HTTP请求消息头 List fileItems = upload.parseRequest(req); Iterator iter = fileItems.iterator(); while(iter.hasNext()) { FileItem item = (FileItem)iter.next(); if(item.isFormField()) { System.out.println("处理表单内容 ..."); processFormField(item, pw); }else{ System.out.println("处理上传的文件 ..."); processUploadFile(item, pw); } }// end while() pw.close(); }catch(Exception e){ System.out.println("使用 fileupload 包时发生异常 ..."); e.printStackTrace(); }// end try ... catch ... }// end doPost() // 处理表单内容 private void processFormField(FileItem item, PrintWriter pw) throws Exception { String name = item.getFieldName(); String value = item.getString(); pw.println(name + " : " + value + "\r\n"); } // 处理上传的文件 private void processUploadFile(FileItem item, PrintWriter pw) throws Exception { // 此时的文件名包含了完整的路径,得注意加工一下 String filename = item.getName(); System.out.println("完整的文件名:" + filename); int index = filename.lastIndexOf("\\"); filename = filename.substring(index + 1, filename.length()); long fileSize = item.getSize(); if("".equals(filename) && fileSize == 0) { System.out.println("文件名为空 ..."); return; } File uploadFile = new File(filePath + "/" + filename); item.write(uploadFile); pw.println(filename + " 文件保存完毕 ..."); pw.println("文件大小为 :" + fileSize + "\r\n"); } // doGet public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { doPost(req, res); } }web.xml 文件
<?xml version="1.0" encoding="gb2312"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>UploadServlet</servlet-class> <init-param> <param-name>filepath</param-name> <param-value>uploadFile</param-value> </init-param> <init-param> <param-name>temppath</param-name> <param-value>temp</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> </web-app>
程序运行过程截图:(在 web.xml 文件中我们把UploadServlet 映射为 upload)
1、启动 Tomcat ,在浏览器输入 URL 并填写 HTML 表单,如下:
2、点击“上传”,发出一个包含了上传文件的复杂 HTTP 请求,由 UploadServlet 进行处理:
先看下 Tomcat 的控制台输出信息:
再看一下浏览器的相应输出:
最后看上传的文件是否被被保存在指定的目录中:
嗯,文件目录和文件保存时间都正确,就是文件大小忘了转化一下…(*^__^*) …
小结:
1、使用开源的 fileupload 包为我们在 UploadServlet 代码中显式地用繁杂的 request.getParameter(“username”) 语句来获取 HTTP 请求所包含的表单值;
2、而且还省去了我们在 UploadServlet 中自己编写判断表单是否是文件或文本类型的代码;
3、更重要的是,FileItem 对象的响应方法可以使得我们轻松地获取文件名、文件大小、路径等等;
4、最重要的是,使用 JD-GUI 反编译器简单地看看开源的 fileupload 包中的类组织结构,这更加有意思、有用处,:-D
相关文章推荐
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能 2010-08-05 23:38:25 标签:Servlet 文件上传 fileupload包 反编译 JD-GUI 原创作品,允许
- 在Servlet中使用开源fileupload包实现文件上传功能 推荐
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- 在Servlet中使用开源fileupload包实现文件上传功能
- CKEditor使用及开启文件上传功能(Servlet实现)
- 004——使用servlet实现文件上传功能
- 使用Servlet实现文件上传功能
- Java代码使用FTPClient实现ftp文件上传下载和删除的功能