`
canofy
  • 浏览: 820081 次
  • 性别: 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

相关推荐

Global site tag (gtag.js) - Google Analytics