commons-fileupload实现上传——JAVA

在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能,例如,上传个人相片、共享资料等。在DRP中,就有这个一个功能,需要将对应的物料图片上传并显示。

对于上传功能,其实在浏览器端提供了很好的支持,只需在Web服务器端获取浏览器上传文件并保存。为了简化和帮助Web开发人员接收浏览器上传的文件,一些公司和组织专门开发了文件上传组件,比如说commons-fileupload,现在就看看这个功能是怎么实现的。

需求:对应的物料图片上传并显示

引入jar包:

首先要引入两个jar包,一个是commons-fileupload.jar包,另一个是commons-io-2.2.jar包。

浏览器端如何支持:

采用post提交;

更改form的enctype属性为:enctype="multipart/form-data",即:

<form name="itemForm" target="_self" id="itemForm" method="post" action="servlet/item/FileUploadServlet" enctype="multipart/form-data">
<span style="white-space:pre">	</span><input name="btn_upload" class="button1" type="submit" id="btn_upload" value="上传"><span style="white-space:pre">			</span>
</form>

关于将上传的图片保存在什么地方的问题,我觉得这两种方法挺好:

第一种:图片保存到本地磁盘。图片的名称对应物料编号。

第二种:图片保存到本地磁盘,同时在数据库中保存此图片名。

两种方法大同小异,详细介绍第二种方法。

实例:

图片保存到本地磁盘,同时在数据库中保存此图片名。

item_upload.jsp中

<%
<span style="white-space:pre">	</span>Item item=(Item)request.getAttribute("item"); //获取request中的值
 %>
<form name="itemForm" target="_self" id="itemForm" method="post" action="servlet/item/FileUploadServlet" enctype="multipart/form-data">
			<input type="hidden" id="itemNo" name="itemNo" value=<%=item.getItemNo() %>>
			<div align="center">
				<table width="95%" border="0" cellspacing="2" cellpadding="2">
					<tr>
						<td>
							 
						</td>
					</tr>
				</table>
				<table width="95%" border="0" cellspacing="0" cellpadding="0"
					height="8">
					<tr>
						<td width="522" class="p1" height="2" nowrap>
							<img src="images/mark_arrow_03.gif" width="14" height="14">
							 
							<b>基础数据管理>>物料维护>>上传物料图片</b>
						</td>
					</tr>
				</table>
				<hr width="97%" align="center" size=0>
				<table width="95%" border="0" cellpadding="0" cellspacing="0">
					<tr>
						<td height="29">
							<div align="right">
								物料代码: 
							</div>
						</td>
						<td>
							<%=item.getItemNo() %>
						</td>
					</tr>
					<tr>
						<td height="74">
							<div align="right">
								图片: 
							</div>
						</td>
					<span style="white-space:pre">	</span><td>
					         <img src="Upload/<%=item.getFileName() %>" width="85" height="49">
						</td>
					</tr>
					<tr>
						<td width="22%" height="29">
							<div align="right">
								<font color="#FF0000">*</font>选择图片: 
							</div>
						</td>
						<td width="78%">
							<input name="fileName" type="file" class="text1" size="40" maxlength="40">
						</td>
					</tr>
				</table>
				<hr width="97%" align="center" size=0>
				<div align="center">
					<input name="btn_upload" class="button1" type="submit"
						id="btn_upload" value="上传">
					    
					<input name="btnBack" class="button1" type="button" id="btnBack"
						value="返回" onClick="history.go(-1)">
				</div>
			</div>
</form>

在Servlet中完成文件上传及将图片写到相应目录并在数据库中保存此图片名称:

public class FileUploadServlet extends HttpServlet {
	File uploadPath=null;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
                //获取物料信息
		ItemManager itemManager=new ItemManagerImpl();
		String itemNo=request.getParameter("itemNo");
		Item item=itemManager.findItemById(itemNo);//查询该物料所有信息
		request.setAttribute("item",item);
		request.getRequestDispatcher("/basedata/item_upload.jsp").forward(request,response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//String uploadPath="C:\\Users\\ZhuDan\\Desktop\\Drp\\DRP系统\\apache-tomcat-7.0.6\\webapps\\drp3.9\\Upload";
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		ItemManager itemManager=new ItemManagerImpl();
		String	itemNo="";
		String fileName="";
  	  if(isMultipart==true){
  	      try{
  	        FileItemFactory factory = new DiskFileItemFactory();
  	        ServletFileUpload upload = new ServletFileUpload(factory);
  	        List<FileItem> items = upload.parseRequest(request);//得到所有的文件
  	       Iterator<FileItem> itr = items.iterator();
  	        while(itr.hasNext()){//依次处理每个文件
  	         FileItem item=(FileItem)itr.next();//获取每个文件的所有信息
  	         //是普通的表单类型
  	         if(item.isFormField()){
  	        	 if("itemNo".equals(item.getFieldName())){
  	        	     itemNo=item.getString();
  	        	 }
  	         }
  	         fileName=item.getName();//获得文件名,包括路径  D:\生活\照片\Friends\蹄蹄\高饶珊.jpg
  	         if(fileName!=null){
  	             File fullFile=new File(item.getName());
  	             //要存入文件夹的路径
  	             File savedFile=new File(uploadPath,fullFile.getName());
  	            //截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
		    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
		    if(itemNo!=null && fileName!=null){
			   itemManager.uploadItemImage(itemNo, fileName);
		    }
		     //存入文件夹
		     item.write(savedFile);
 	             // File fullFile=new File(itemNo);
 	            // File savedFile=new File(uploadPath,fullFile.getName()+".jpg");
  	         }
  	        }
  	       // System.out.print("upload succeed");
  	      }
  	      catch(Exception e){
  	         e.printStackTrace();
  	      }
  	      finally{
  	    	  response.sendRedirect("QueryServlet");
  	      }
  	  }
	}
	public void init() throws ServletException{
	      uploadPath=new File(getServletContext().getRealPath("Upload"));//获取用于保存图片的Upload文件夹的路径
	      if(!uploadPath.exists()){  //如果不存在Upload文件夹,则创建
			uploadPath.mkdir();
	      }
	}
}

界面效果如下:

数据库中字段:

对应的本地文件夹(tomcat)中:

总结:

原理如下: FileUpload组件将页面提交的所有元素(普通form表单域,如input和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对 每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。

commons-fileupload实现上传——JAVA

时间: 2024-08-10 11:02:13

commons-fileupload实现上传——JAVA的相关文章

commons.fileupload 文件上传

编辑jsp页面获取文件 1 <html> 2 <head> 3 <base href="<%=basePath%>"> 4 5 <title>My JSP 'upload.jsp' starting page</title> 6 7 <meta http-equiv="pragma" content="no-cache"> 8 <meta http-equi

fileupload文件上传

在使用java开发文件上传时,网络上有很多不一样的工具.但是每次如果都需要开发一次,对于使用者来说,这个过程是浪费时间的.所以我们有必要选取其中一个适合自己的文件上传组件,然后对其进一步分装,形成自己的开发工具类.下面我针对自己的工程,对fileupload进行了封装. fileupload是apache的一个组件,要想使用fileupload,需要用到下面两个jar:commons-fileupload-1.3.1.jar,commons-io-1.1.jar(版本不一样,可能相关jar包不一

使用Eclipse上传java工程到github

使用Eclipse上传Java工程到github 1.登录github账户,Create a new repository(创建一个知识库)名称为:eclipse_upload 创建完成之后,跳转到以下界面. 注意:https://github.com/heyangyi/eclipse_upload.Git地址是待会使用eclipse上传代码到知识库的地址. 2.打开eclipse创建一个名为:eclipse_upload_git的javaWeb项目.添加index.jsp页面,在body部分添

改变FileUpload文件上传控件的显示方式,确认后上传

一.Aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploadDemo.aspx.cs" Inherits="WebApplication1.FileUploadDemo" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu

ASP.NET中扩展FileUpload的上传文件的容量

ASP.NET中扩展FileUpload只能上传小的文件,大小在4MB以内的.如果是上传大一点的图片类的可以在web.config里面扩展一下大小,代码如下 <system.web> <!--配置文件上传大小,该配置是上传文件的总大小不超过15MB==15360KB,缓存阈值改为100kB,这样可以上传稍微大一点的图片--> <httpRuntime maxRequestLength="15360" requestLengthDiskThreshold=&

(转)ASP.NET(C#)FileUpload实现上传限定类型和大小的文件到服务器

上传文件有两个主要的目的地,一个是服务器,另一个是数据库,ASP.NET内置了FileUpload这个上传控件,文本框显示用户选择的文件的全名. 其属性主要包括: ContenLength:上传文件大小,单位:字节 FileName:文件名称 HasFile:是否选择了文件 例子:测试环境.net 2.0(内有详细说明) default.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile=&q

ASP.NET(C#)FileUpload实现上传限定类型和大小的文件到服务器&lt;from Copying&gt;

2009-02-15 11:52:54|  分类: 默认分类 |  标签: |举报 |字号大中小 订阅 ASP.NET(C#)FileUpload实现上传限定类型和大小的文件到服务器 2009-01-07 23:29 上传文件有两个主要的目的地,一个是服务器,另一个是数据库,ASP.NET内置了FileUpload这个上传控件,文本框显示用户选择的文件的全名. 其属性主要包括: ContenLength:上传文件大小,单位:字节 FileName:文件名称 HasFile:是否选择了文件 例子:

java FileUpload 组件上传文件

Commons FileUpload Apache提供的一个组件,可以很方便的让我们处理客户端上传的文件, 下载地址 http://commons.apache.org/proper/commons-fileupload/ 下载commons-fileupload.jar,还有其依赖包 commons-io.jar一同下载好,导入工程 有点奇葩的是,在tomcat下已经把這个组建集成了,但是不能正常使用,其源码基本上是一样的. 正确的包名应该是這个:org.apache.commons.file

记录: 百度webuploader 分片文件上传java服务器端(spring mvc)示例的优化

最近项目上用到文件分片上传,于是找到了百度的一个开源前端控件webuploader. 于是尝试使用. 下载下来后,它提供的服务器端示例代码是php版的,那么Java版的呢? 其实,上传文件都是按照rfc1867标注来的, 只是分段上传需要在前端多做点事情.分段上传原理其实就是在前端使用JavaScript对文件进行分割成不同小块,然后每次ajax请求就post一小块,直到全部收到为止. 但是,为了确保后端能判断文件是否完整的收到,需要得知当前是第几块,一共多少块,每个分段的大小是多少(前后端同学