Commons--fileUpload 上传组建

本文介绍如何在Web应用中实现文件上传功能,包括在前端页面添加文件上传输入项及在后端Servlet中处理上传文件的方法。详细解释了如何配置form表单、使用Commons-fileupload组件解析并保存上传文件。

一 概念

1.实现web开发中的文件上传功能,需完成如下二个步骤:

(1)在web页面中添加上传输入项(jsp页面或html页面)

(2)在 servlet中读取上传文件的数据,并保存在本地硬盘中

2.如何在web页面中添加输入项

<input type=”file”>标签用于在web页面中添加文件上传输入项

(1)必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据

(2)必须把form的enctype属性值设置为multipart/form-data,设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

3.如何在servlet中读取文件中上传的数据并保存到本地硬盘中

使用Commons-fileupload组件实现文件上传

二 核心API

1.DiskFileItemFactory 工厂类

DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:

(1)public void setSizeThreshold(intsizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件。

(2)public void setRepository(java.io.Filerepository) :指定临时文件目录,默认值为System.getProperty("java.io.tmpdir").

(3)public DiskFileItemFactory(int

sizeThreshold, java.io.Filerepository) :构造函数

2. ServletFileUpload 解析类

ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:

(1)boolean isMultipartContent(HttpServletRequestrequest) :判断上传表单是否为multipart/form-data类型

(2)List parseRequest(HttpServletRequestrequest):解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。

(3)setFileSizeMax(longfileSizeMax) :设置上传文件的最大值

(4)setSizeMax(longsizeMax) :设置上传文件总量的最大值

(5)setHeaderEncoding(java.lang.Stringencoding) :设置编码格式

(6)setProgressListener(ProgressListenerpListener)

三 思路分析

1.文件上传的思路分析

文件上传必定要用jsp中的form标签来显示页面,只要把input的类型设置为file就OK,再者就是在点击上传文件按钮的时候,要做处理,处理当然要交到servelt层去处理了,在servlet中获取消息头中的值,并判断是否是输入项,如果正确,跳转到成功页面,如果失败,跳转到失败页面。注意在上面介绍了在web页面中添加的输入项,必须修改form表单中的默认选项。

2.实现的具体思路

在servelt中用Apache中提供的组件实现上传

Fileupload组件的工作流程

把请求消息中每一个请求项都解析成对象item1 item2...

Fileltem[] item = ServeltFileupLoad upload.parseRequest()

item1.isFormFiled()

如果返回的是true,则说明是普通的输入项,可调用

Item1.getString() 来得到输入项的值 老王

Item1.getFieldName() 得到输入项的名字 user

如果返回值是false,则说明是文件的上传项,可调用

Item1.getName()得到用户上传的文件的文件名

getInputStream()流对象得到内容



将File表单和其它表单的信息同时获取。


利用的是Common-fileupload组件,需要两个包:commons-fileupload-1.2.jar和commons-io-1.3.2.jar这两个包,可以从它的官方去下载(里面有doc和src)。
另外,我们还需要在WebRoot目录下,新建两个文件夹,ImagesUploadTemp 和upload。其中,我们将上传的文件放到upload目录下边。


============================================================


package com.timj.servlet; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UploadServlet extends HttpServlet { /** * Constructor of the object. */ public UploadServlet() { super(); } /** * Destruction of the servlet. <br> */ public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here } /** * The doGet method of the servlet. <br> * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } /** * The doPost method of the servlet. <br> * * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String adjunctname ; String fileDir = request.getRealPath("upload/"); //指定上传文件的保存地址 String message = "文件上传成功"; String address = ""; if(ServletFileUpload.isMultipartContent(request)){ //判断是否是上传文件 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(20*1024); //设置内存中允许存储的字节数 factory.setRepository(factory.getRepository()); //设置存放临时文件的目录 ServletFileUpload upload = new ServletFileUpload(factory); //创建新的上传文件句柄 int size = 2*1024*1024; //指定上传文件的大小 List formlists = null; //创建保存上传文件的集合对象 try { formlists = upload.parseRequest(request); //获取上传文件集合 } catch (FileUploadException e) { e.printStackTrace(); } Iterator iter = formlists.iterator(); //获取上传文件迭代器 while(iter.hasNext()){ FileItem formitem = (FileItem)iter.next(); //获取每个上传文件 if(!formitem.isFormField()){ //忽略不是上传文件的表单域 String name = formitem.getName(); //获取上传文件的名称 if(formitem.getSize()>size){ //如果上传文件大于规定的上传文件的大小 message = "您上传的文件太大,请选择不超过2M的文件"; break; //退出程序 } String adjunctsize = new Long(formitem.getSize()).toString(); //获取上传文件的大小 if((name == null) ||(name.equals(""))&&(adjunctsize.equals("0"))) //如果上传文件为空 continue; //退出程序 adjunctname = name.substring(name.lastIndexOf("\\")+1,name.length()); address = fileDir+"\\"+adjunctname; //创建上传文件的保存地址 File saveFile = new File(address); //根据文件保存地址,创建文件 try { formitem.write(saveFile); //向文件写数据 } catch (Exception e) { e.printStackTrace(); } } } } request.setAttribute("result", message); //将提示信息保存在request对象中 RequestDispatcher requestDispatcher = request .getRequestDispatcher("index.jsp"); //设置相应返回地址 requestDispatcher.forward(request, response); } /** * Initialization of the servlet. <br> * * @throws ServletException if an error occurs */ public void init() throws ServletException { // Put your code here } }


=========================================================================================


<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <script type="text/javascript"> function validate(){ if(form1.file.value == ""){ alert("请选择要上出的文件 "); return false; } } </script> <form action="UploadServlet" method="post" enctype="multipart/form-data" name="form1" id="form1" onsubmit="return validate()"> <table width="30%" border="0" align="center"> <tr bgcolor="#CCCCCC"> <td height="26">请选择要上传的附件:</td> </tr> <tr height="33"> <td height="33">上传文件: <label><input type="file" name="file"/></label></td> </tr> <tr bgcolor="#CCCCCC"> <td height="23"> <label> <div align="center"> <input type="submit" name="Submit1" value="上传" /> <input type="reset" name="Submit2" value="重置"/> </div> </label> </td> </tr> </table> <% if(request.getAttribute("result")!=null){ out.println(" <script>alert('" + request.getAttribute("result") + "');</script>"); } %> </form> </body> </html>


============================================================================================


<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.timj.servlet.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值