`
ipenglei
  • 浏览: 3937 次
  • 性别: Icon_minigender_1
  • 来自: 湖面
社区版块
存档分类
最新评论

jsp+servlet文件上传(commons-fileupload)

    博客分类:
  • java
阅读更多

文件上传的时要注意的是 form 表单必须是 method = "post" enctype = “multipart/form-data”

 

 

<form action="FileUpload" method="post" enctype="multipart/form-data">
   	 file : <input type="file" name="file"/><br>
   	 <input type="submit" value="submit">
</form>

 

 

借助第三方库 (commons-fileupload) ,commons-fileupload 依赖 commons-io

 

Servlet 代码:FileUpload

 

 

public void doPost(HttpServletRequest request, HttpServletResponse response)
   		 throws ServletException, IOException {

//   	 检查一个请求是否是一个文件上传的请求
   	 if(ServletFileUpload.isMultipartContent(request)){
//   		 创建一个基于磁盘文件条目的工厂
   		 DiskFileItemFactory factory = new DiskFileItemFactory();
   		 
//   		 分别指定缓存文件路径和文件上传的目录
   		 String tempPath = getServletContext().getRealPath("temp");
   		 String filePath = getServletContext().getRealPath("file");
   		 
//   		 你也可以给这个工厂添加一些约束
//   		 超过设置的值会写到给出的磁盘目录中
   		 factory.setSizeThreshold(1024*1024);
   		 factory.setRepository(new File(tempPath));    
//   		 或者直接使用这个构造方法
//   		 DiskFileItemFactory factory1 = new DiskFileItemFactory(1024*1024, new File("temp"));
   		 
//   		 创建了个文件上传的处理
   		 ServletFileUpload upload = new ServletFileUpload(factory);
   		 upload.setFileSizeMax(1024*1024*10);
   		 
   		 try {
//   			 解释请求, 得到一个文件条目的List    
   			 @SuppressWarnings("unchecked")
   			 List<FileItem> items = upload.parseRequest(request);
   			 
   			 for(FileItem item : items){
   				 
//   				 判断一个条目是否是一个普通的字段域
   				 if(item.isFormField()){
   					  /*
   					   * 对提交过来的表单中普通的参数进行处理
   					   * name 是参数名
   					   * value 是参数的值
   					   */
   					 String name = item.getFieldName();
   					 String value = item.getString();
   					 
   				 }else{
   					 
   					 /*
   					  * 对文件进行相关的操作
   					  */
   					 
   					 String fieldName = item.getFieldName();
   					 String fileName = item.getName();
   					 String contentType = item.getContentType();
   					 boolean isInMemory = item.isInMemory();
   					 long sizeInByte = item.getSize();
//   					 ... ...
   					 
//   					 把文件写入到磁盘
   					 item.write(new File(filePath, fileName));
   				 }
   				 
   			 }
   			 
   		 } catch (Exception e) {
   			 // TODO Auto-generated catch block
   			 e.printStackTrace();
   		 }
   		 
   		 
   	 }
   	 
    }

 

 

把大的文件一直存放在内存里面是不现实的。所以可以看到下面的这段代码
factory.setSizeThreshold(1024*1024);
这样当你上传的文件超过这个设置的值的大小 ,文件会被写到磁盘上的一个临时文件里面,之后又会被 org.apache.commons.io.FileCleaner这个类自动的清理掉。FileCleaner 会开启一个回收的线程。
如果不再使用这个使用的时候,应该要停止这个线程。比如
web应用程序结束的时候(停止Tomcat时。org.apache.commons.fileupload.servlet.FileCleanerCleanup 会停止掉这个临时文件清理线程。这时需要配制一个监听器,在web-app里加上配制文件:

 

 

<listener>
	<listener-class>
  	org.apache.commons.fileupload.servlet.FileCleanerCleanup
	</listener-class>
 </listener>

 

 

或者你也可使用 FileCleanerCleanup 提供一个 org.apache.commons.io.FileCleaningTracker 实例来进行清理临时文件。在构建DiskFileItemFactory 时可以加上这样的代码。

 

 

FileCleaningTracker fileCleaningTracker
            	= FileCleanerCleanup.getFileCleaningTracker(getServletContext());
   		
  factory.setFileCleaningTracker(fileCleaningTracker);
 

Item有一个简单的方法可以把文件写到磁盘上(Item.writer(file)),或者也可以自己使用 OuputStream 把文件写到磁盘上,这样可以做一些其他的操作,比如计算一个文件的上传进度反馈给用户。

 

相对 Item.write(),comment-fileupload 还提供了一种性能上更好的方式把文件写到磁盘上

 

 

try {
				
//		对请求进行解释,得到一个文件条目的迭代器
		FileItemIterator iter = upload.getItemIterator(request);
//		进行迭代
		while (iter.hasNext()){
					
			FileItemStream item = iter.next();
			String fieldName = item.getFieldName();
			InputStream in = item.openStream();
//			进行判断
			if(item.isFormField()){
//				得到参数的值
				String fieldValue = Streams.asString(in);
						
			}else{
//				文件名
				String fileName = item.getName();
//				创建一个输出流
				OutputStream out = new BufferedOutputStream(
					new FileOutputStream(new File(filePath,fileName)));
//				文件输出到磁盘
				Streams.copy(in, out, true);			
			}
		}
				
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
 

 

参考: http://commons.apache.org/fileupload/using.html

 

 

 

分享到:
评论

相关推荐

    java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载

    在Java Web开发中,文件的上传与下载是常见的功能需求,尤其...通过以上步骤,你可以实现基于Java Servlet和Apache Commons库的文件上传与下载功能。理解并熟练掌握这些知识点,对于开发高效、稳定的Web应用至关重要。

    commons-fileupload-1.3.jar和commons-io-1.2.jar.zip

    **Apache Commons FileUpload** 是一个专门处理HTTP请求中多部分数据的Java库,它使得在Servlet和JSP中处理文件上传变得简单。在HTTP协议中,文件上传通常使用`multipart/form-data`编码类型进行,FileUpload库可以...

    commons-fileupload-1.3.3.jar和commons-io-1.3.2.jar程序文件

    这两个库在Java Web应用、尤其是Servlet和JSP开发中非常常见,它们简化了文件上传的实现,使得开发者能够专注于业务逻辑,而不是底层的I/O操作。同时,由于它们都是开源的,有着良好的社区支持和文档,因此在遇到...

    commons-fileupload.rar;包括commons-fileupload-1.3.1-bin和commons-io-2.4

    文件上传在Web应用中的实现并不直接内置在Servlet API中,因此,`commons-fileupload`库提供了一套完整的解决方案。它支持多部分请求(Multipart Request),这是HTTP协议中用于文件上传的一种格式。以下是一些关键...

    commons-fileupload-1.3.2jar和commons-io-2.5.jar包

    通过Apache Commons FileUpload和Commons IO库,开发者可以轻松实现JSP中的文件上传功能,同时确保了性能和安全性。这两个库的结合使用,极大地简化了文件上传的复杂性,使得开发者可以专注于业务逻辑,而不是底层的...

    commons-fileupload-1.3.2jar包和commons-io-2.5jar包.zip

    Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传和I/O操作的重要库。这两个库在处理Web应用,特别是基于JSP(JavaServer Pages)的文件上传功能时,扮演着核心角色。在这个主题中,我们将...

    commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar

    在处理文件上传时,`commons-fileupload`可能会依赖`commons-io`来完成一些底层的文件操作,比如读写文件、复制文件、检查文件是否存在等。`1.3.2`同样表示这个库的一个特定版本,它可能包含了更多的功能和改进。 ...

    jsp多附件上传commons-fileupload-1.1.jar

    本教程将详细讲解如何利用Apache Commons FileUpload库实现在JSP中实现多文件上传功能。Apache Commons FileUpload是一个强大的、灵活的工具,它允许开发者在Servlet环境中处理文件上传请求。 首先,我们需要在项目...

    使用commons-fileupload上传文件

    【使用commons-fileupload上传文件】 Apache Commons FileUpload是Apache组织的一个子项目,专注于处理HTTP文件上传。这个组件提供了一个简洁的API,使得开发者能够轻松地在Java应用中处理由浏览器发送的多部分...

    java 上传 SmartUpload&commons-fileupload

    SmartUpload是一个强大的Java上传组件,由Julien DROUET开发,它为JSP和Servlet提供了方便的文件上传功能。SmartUpload提供了一套完整的API,可以方便地处理多个文件上传,同时支持各种自定义设置,如上传文件大小...

    java上传下载需要的jar:commons-fileupload-1.2.jar+commons-io-1.3.2.jar

    在传统的Servlet API中,处理文件上传并不直接,但通过FileUpload库,我们可以方便地解析上传的文件数据,并将其保存到服务器。库的核心类包括`FileItem`,用于表示上传的单一文件或表单字段,以及`FileUpload`,...

    struts2上传文件需要的jar包 commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar

    在Struts2中处理文件上传功能时,通常需要依赖两个关键的第三方库:`commons-fileupload`和`commons-io`。这两个jar包在Java文件上传处理中扮演着至关重要的角色。 `commons-fileupload-1.2.1.jar`是Apache Commons...

    struts1.2和commons-fileupload实现文件上传

    Struts1.2和Commons-Fileupload是Java Web开发中用于实现文件上传的两个重要组件。Struts1.2是Apache的一个开源框架,主要用于构建MVC(模型-视图-控制器)架构的Web应用程序,而Commons-Fileupload则是Apache ...

    commons-fileupload-1.2.jar和commons-io-1.3.2.jar

    `commons-fileupload-1.2.jar`是该库的一个特定版本,它包含了处理文件上传的核心类和方法,例如`DiskFileItemFactory`用于配置临时存储文件的方式,以及`ServletFileUpload`用于解析HTTP请求中的文件数据。...

    commons-fileupload-1.2.1.jar和commons-io-1.4.jar

    标题中的"commons-fileupload-1.2.1.jar"和"commons-io-1.4.jar"是两个在Java开发中非常重要的库文件,主要用于处理文件上传功能。它们都是Apache Commons项目的一部分,Apache Commons是一个致力于提供可重用Java...

    commons-fileupload-1.0上传组件使用实例.

    ### 使用commons-fileupload-1.0进行文件上传的实例及乱码处理 #### 一、commons-fileupload简介 `commons-fileupload`是Apache Commons项目下的一个子项目,它提供了强大的文件上传功能,允许用户轻松地将文件从...

    commons-fileupload和commons-io的jar包

    Apache Commons FileUpload与Apache Commons IO是Java开发中两个非常重要的库,它们主要用于处理文件上传和I/O操作。这两个库在Web应用、数据处理以及文件管理等领域广泛应用。 Apache Commons FileUpload库是一个...

    commons-fileupload-1.4.rar

    在Web开发中,尤其是基于Servlet和JSP的应用中,用户经常需要上传文件,如图片、文档等。这个库简化了这个过程,避免了直接操作Servlet API的复杂性。 在标题中提到的"commons-fileupload-1.4.rar"是一个压缩包,...

    commons-fileupload

    "commons-fileupload"是Apache Commons项目中的一个子项目,专门用于处理JSP和Servlet应用程序中的文件上传功能。在Web开发中,尤其是用户需要上传图片、文档等文件时,这个组件显得尤为重要。它提供了简单易用的API...

Global site tag (gtag.js) - Google Analytics