`
canofy
  • 浏览: 829800 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

commons-fileupload组件上传问题

    博客分类:
  • j2EE
阅读更多
html源码upload.html很简单:
<h1> 文件上传演示</h1>
<form name="uploadform" method="POST" action="upload" ENCTYPE="multipart/form-data">

     <table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF">
         <tr>
              <td width="100%" colspan="2">
                   文件1:<input name="a" size="40" type="file">
              </td>
         </tr></table>

java源码Uplad.java是:
import java.io.File;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Iterator;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class Upload extends HttpServlet {


     private static final long serialVersionUID = 1L;

 

     public void doPost(HttpServletRequest request, HttpServletResponse response)

              throws ServletException, IOException {

         response.setContentType("text/html; charset=GB2312");

         PrintWriter out = response.getWriter();

         try {

              DiskFileItemFactory factory = new DiskFileItemFactory(); 

              ServletFileUpload sevletFileUpload = new ServletFileUpload(factory);

              // 设置允许用户上传文件大小,单位:字节,这里设为2m

              sevletFileUpload.setSizeMax(2 * 1024 * 1024);

              // 设置最多只允许在内存中存储的数据,单位:字节

              factory.setSizeThreshold(4096);

              // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录

              factory.setRepository(new File("d:\\upload\\temp"));

              // 开始读取上传信息 

              List fileItems = sevletFileUpload.parseRequest(request);

              // 依次处理每个上传的文件

              Iterator iter = fileItems.iterator(); 

              // 正则匹配,过滤路径取文件名

              String regExp = ".+\\\\(.+)$"; 

              // 过滤掉的文件类型

              String[] errorType = { ".exe", ".com", ".cgi", ".asp" };

              Pattern p = Pattern.compile(regExp);

              while (iter.hasNext()) {

                   FileItem item = (FileItem) iter.next();

                   // 忽略其他不是文件域的所有表单信息

                   if (!item.isFormField()) {

                       String name = item.getName();

                       long size = item.getSize();

                       if ((name == null || name.equals("")) && size == 0)

                            continue;

                       Matcher m = p.matcher(name);

                       boolean result = m.find();

                       if (result) {

                            for (int temp = 0; temp < errorType.length; temp++) {

                                 if (m.group(1).endsWith(errorType[temp])) {

                                     throw new IOException(name + ": 非法文件类型禁止上传");

                                 }

                            }

                            try {

                                 // 保存上传的文件到指定的目录

                                 // 在下文中上传文件至数据库时,将对这里改写开始

                                 item.write(new File("d:\\upload\\"+ m.group(1)));

 

                                 out.print(name + "&nbsp;&nbsp;" + size + "<br>");

                                 // 在下文中上传文件至数据库时,将对这里改写结束

                            } catch (Exception e) {

                                 out.println(e);

                            }
                       } else {

                            throw new IOException("fail to upload");

                       }

                   }

              }

         } catch (IOException e) {

              out.println(e);

         } catch (FileUploadException e) {

              out.println(e);

         }

     }

}

web.xml源码:
<servlet>
		<servlet-name>upload</servlet-name>
		<servlet-class>Upload</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>upload</servlet-name>
		<url-pattern>/upload</url-pattern>
	</servlet-mapping>

为什么运行不了呢?Tomcat一直显示如下提示:
引用
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet execution threw an exception


root cause

java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:191)
org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:350)
org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
Upload.doPost(Upload.java:87)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.

87行是
List fileItems = sevletFileUpload.parseRequest(request);
这一行,不知道为啥会出现这样的错误。把程序简化成单个文件上传的代码也是出现一样的问题。也照apche的官方网站去看了那个指南,照那个做的,也是这里出错。实在是搞不懂了,为什么看到的都是好好的,到我这里就出错了呢?是哪里少做了什么吗?能想到的就只有那个jar文件导入有误。
  • upload.rar (338.5 KB)
  • 描述: 整个代码
  • 下载次数: 389
分享到:
评论
7 楼 hualikejava 2013-12-09  
我也遇到这个问题,我直接添加了一个commons-io1.2.jar 完美解决问题。
http://www.mkyong.com/struts/java-lang-noclassdeffounderror-orgapachecommonsiooutputdeferredfileoutputstream/
6 楼 ddnzero 2013-04-14  
谢谢了 同样的问题
5 楼 gongstring 2009-09-26  
fczhangsong 写道
下载 commons-io-1.2.zip :
http://jakarta.apache.org/site/downloads/downloads_commons-io.cgi
如果没有下载这个library,会出现下面这个Exception,这个花了我不了的时间找.
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream



今天我也遇到了这个问题,是因为common-io.jar包没有导入的原因,已经解决了。不过还是感谢博主的这篇文章,谢过了!
4 楼 k7710 2009-02-22  
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
3 楼 east_java 2008-12-25  
fczhangsong 写道

下载 commons-io-1.2.zip : http://jakarta.apache.org/site/downloads/downloads_commons-io.cgi 如果没有下载这个library,会出现下面这个Exception,这个花了我不了的时间找. java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream

谢谢。。我也有这个问题啊。。。
2 楼 canofy 2008-01-08  
谢谢了~~~~
没有想到还需要相应的包~~~
1 楼 fczhangsong 2007-12-28  
下载 commons-io-1.2.zip :
http://jakarta.apache.org/site/downloads/downloads_commons-io.cgi
如果没有下载这个library,会出现下面这个Exception,这个花了我不了的时间找.
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream

相关推荐

    commons-fileupload组件和commons-io组件

    **Commons-Fileupload组件** Commons-Fileupload是Apache Commons项目的一个子项目,专门设计用于处理Servlet容器中的文件上传请求。它提供了一套API,使得开发者可以方便地解析HTTP请求中的多部分(multipart)...

    commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar

    标题中的"commons-fileupload-1.3.3&commons-fileupload-1.3.3架包和代码.rar"提到了Apache Commons FileUpload的1.3.3版本的库及其源码。Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的多部分...

    commons-fileUpload组件

    标题"commons-fileUpload组件"指的是Apache Commons FileUpload,这是一个Java库,专门用于处理HTTP请求中的文件上传。它与另一个组件Apache Commons IO紧密协作,为Java应用程序提供方便、高效的文件上传功能。 ...

    commons-fileupload-1.3.3.jar commons-io-2.5.jar

    `commons-fileupload-1.3.3.jar` 是这个库的特定版本,它包含了处理文件上传的核心组件。该库提供了一套完整的API,允许开发者解析HTTP请求中的文件项,进而可以将这些文件存储到服务器上。这个版本的更新可能包括了...

    commons-fileupload及源码

    FileUpload组件的核心功能是解析HTTP请求中的多部分数据(Multipart Form Data),这是HTML表单中用于上传文件的标准格式。它的工作原理如下: 1. **解析请求**:当用户通过HTML表单提交包含文件的请求时,服务器端...

    commons-fileupload.jar和commons-io.jar

    Apache Commons FileUpload和Commons IO两个库是Java中处理文件上传的关键组件,它们为SpringMVC和MyBatis这样的框架提供了强大的支持。本篇文章将深入探讨这两个库以及它们在图片处理中的作用。 首先,`commons-...

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

    Commons FileUpload和Commons IO是Java开发中两个非常重要的库,尤其在处理文件上传功能时。这两个库由Apache软件基金会维护,是许多Java Web应用程序的标准组成部分。 `commons-fileupload-1.3.2.jar`是Apache ...

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

    common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。 -下载后解压zip包,将commons-...

    基于commons-fileupload组件的上传下载

    【基于commons-fileupload组件的上传下载】是一种在J2EE环境下处理文件上传和下载功能的技术。这个组件是Apache Commons项目的一部分,提供了强大的文件上传能力,适用于JSP和Servlet应用程序。以下将详细介绍如何...

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

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

    commons-fileupload-1.3.3-bin

    Apache Commons是Apache软件基金会的一个项目,致力于提供高质量的Java组件,而FileUpload就是其中的一个组件。 在Web开发中,文件上传通常是一个复杂的过程,涉及到多个步骤和潜在的问题,如文件大小限制、多部分...

    commons-fileupload-1.3.1.jar

    Apache Commons FileUpload库简化了这一过程,提供了高效且灵活的文件上传解决方案。 Apache Commons是Apache软件基金会的一个项目集合,它提供了许多实用工具类和组件,用于解决Java编程中的常见问题。"commons...

    commons-fileupload-1.4-bin.zip

    《Apache Commons FileUpload组件详解》 Apache Commons FileUpload是一个用于处理HTTP请求中多部分数据的Java库,尤其在上传文件时极为有用。标题中的"commons-fileupload-1.4-bin.zip"表明这是一个包含Apache ...

    commons-fileupload-1.4 jar包.rar

    Apache Commons FileUpload组件就是为了解决这一问题而设计的,它提供了一套完整的解决方案,使得开发者可以方便、高效地处理HTTP请求中的多部分数据,即文件上传。本篇文章将深入解析这个组件,帮助开发者更好地...

    Apache上传下载组件commons-fileupload,commons-io

    Apache上传下载组件commons-fileupload,commons-ioApache上传下载组件commons-fileupload,commons-ioApache上传下载组件commons-fileupload,commons-io

    commons-fileupload-1.3.3

    commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前后台的一致性,注意在后台定义File文件对象名要与jsp页面中的file标签name名字一致,前台form标签属性一定要设置为enctype="multipart/form-data",而且...

Global site tag (gtag.js) - Google Analytics