我想用fileupload上传文件,却发现成功不了,在 List fileItems=fu.parseRequest(request)这里出错;我的代码:
 try{
     DiskFileUpload fu=new DiskFileUpload();
    fu.setSizeMax(1000000);
    fu.setSizeThreshold(1096);
    fu.setRepositoryPath("c:\\");
    if(request!=null)
   {
     List fileItems=fu.parseRequest(request);
     Iterator i = fileItems.iterator();
     Hashtable ht = new Hashtable();
     InputStream in = null;
     int size = 0;
     while (i.hasNext()) {
       FileItem fi = (FileItem) i.next();
       if (fi.isFormField()) {
         ht.put(fi.getFieldName(), fi.getString());
        }
       else {
         in = fi.getInputStream();
         size = (int) fi.getSize();
         if (in != null && size > 0) {
           ht.put("filetype", fi.getContentType());
           ht.put("filename", fi.getName());
         }
       }
     }
   }
  }catch(Exception e){
    e.printStackTrace(System.err);
  }
若知出错原因,请赐教,小弟不胜感激!

解决方案 »

  1.   

    我的html代码:
      <form   method="post"   action="/WebModule1/servlet1" enctype="multipart/form-data">
      <input type="file" name="image">
      <input type="submit" value="上传" name="submit" size="25">
      <input type="reset" value="清除" name="clear" size="25">
      </form>
      

  2.   

    我和楼主碰到了一样的问题.
    而且怪就怪在,我在Eclipse里调试时报这个错,但是把程序复制到tomcat\webapps里后,却又能正常运行了!然后,我换了台电脑,安装了完全一样的JSP环境,却又出这个错了,无论是在Eclipse中还是tomcat\webapps中,都报这个错:
    type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException: Exception in JSP: /upup.jsp:4441: 
    42:  try {
    43:  // Parse the request
    44:  List items = upload.parseRequest(request);真是奇怪,为了排除是客户端(IE)设置的问题,我让这两台电脑互访,结果还是相同的.
      

  3.   

    是不是你们的项目下没有commons-fileupload.jar这个包
      

  4.   

    照理说这个错误是没有关系的,eclipse 的检错机制有时太强,具体原因可能是你没有加这个包
      

  5.   

    你的代码在我的机器里能编译通过,在jdk+Tomcat下用javac 文件名.java编译通过
      

  6.   

    有这个包commons-fileupload-1.1.1.jar放在/common/lib,但程序还是搓搓
      

  7.   

    FileUpload1.1版本 资料2006-12-28 12:50< GetFile.java :> <> 
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Iterator;
    import java.util.List;
    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.*;<> < HttpServlet extends GetFile> 
      */
     public GetFile() {
      super();
     }
      */
     public void destroy() {
      super.destroy(); // Just puts "destroy" string in log
      // Put your code here
     }
       throws ServletException, IOException {
      
      
      PrintWriter out = response.getWriter();
      DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置上传限制等通过此对象设置.
      factory.setSizeThreshold(4000);       //设置缓存大小,即临时放在内存中的大小
      factory.setRepository(new File("d:/fileupload/temp/")); //设置临时文件夹
      ServletFileUpload fileUpload=new ServletFileUpload(factory); //构造fileUpload对象
      fileUpload.setSizeMax(1024000000);
      
      try {
       List list=fileUpload.parseRequest(request);
       Iterator item=list.iterator();
       
       while(item.hasNext()){
        
        FileItem fileItem = (FileItem)item.next();
        
        String fileName = fileItem.getName();  //获取上传文件名,接下来处理一下,取出 文件名.扩展名 即可
        fileName = fileName.substring(fileName.lastIndexOf("\\"));
        
        File uploadDir = new File("d:/fileupload/uploadDir/",fileName); //构造上传文件存放位置
       
        fileItem.write(uploadDir);
        
       }
       
      } catch (FileUploadException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       out.println("上传失败.FileUploadException");
      } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
       out.println("上传失败.Exception");
      }
      
     }
      // Put your code here
     }< uploadfile.jsp  
        pageEncoding="gb2312"%>
    <html>
    <head>
    </head>
    <body>
       Please select file(选择上传文件)
       <input type="file" >
       <input type="submit" value="Upload">
      </form>
    </body>
    </html>
     
    ----------------------------------
    查阅资料 1 <>   以前一向以 JspSmartUpload 或 Oreilly MultiPartRequest 上載文件到伺服器.
    今次使用 Apache Commons FileUpload .首先下載 commons-fileupload-1.1.1.zip
    http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi 
    下載後將 commons-fileupload-1.1.1.jar 放進 Project_name/WEB-INF/lib 裡.下載 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/DeferredFileOutputStreamUploadExcel.java
    public class UploadExcel{
     String tempDirectory = "/web_project_path/excel/temp/";  // 設定暫存目錄
     String fileDirectory = "/web_project_path/fileupload/";  // 設定上存檔案目錄
     String fileExtention = ".xls";
     
     public UploadExcel() {} public int uploadFile(HttpServletRequest request) {
      try {   
       DiskFileItemFactory factory = new DiskFileItemFactory();  // 建立factory
       factory.setSizeThreshold(4000);  // 設定緩存大小
       factory.setRepository(new File(tempDirectory));  // 設定暫存Directory
       ServletFileUpload upload = new ServletFileUpload(factory);  // 建立Servlet File
       upload.setSizeMax(1000000);  // 設定上存檔案最大容量
       
       List items = upload.parseRequest(request);
       Iterator iter = items.iterator();
      
       while (iter.hasNext()) {   // 這裡lookup所有上存檔案   
        FileItem item = (FileItem) iter.next();    //if (item.isFormField()) {
        // String // 這裡取得parameter的名字
        // String value = item.getString();     // 取得parameter的數值
        //}
        if (!item.isFormField()) {
         String fieldName = item.getFieldName();
         String fileName = item.getName();
         // String contentType = item.getContentType();
         // boolean isInMemory = item.isInMemory();
         // long sizeInBytes = item.getSize();
         if(!fileName.endsWith(fileExtention)) continue; //這裡亦可使用contentType來判斷
         File uploadedFile = new File(fileDirectory + fieldName
           + ".xls");
         item.write(uploadedFile);  //將檔案寫到上存目錄
        }
       }  } catch (Exception e) {
       System.out.println("Exception (UploadExcel): " + e);
       return -1;
      }
      return 1;
     }}
    uploadexcel.jsp
    <jsp:useBean scope="page" /><html>
     <head>
      <meta http-equiv="Content-Type" content="text/html; charset=big5">
      <title>Upload Excel</title>
     </head>
     <body><%
     int iError = 1;  
     if (request.getParameter("action") != null
       && request.getParameter("action").equals("upload")) {   // 判斷是否上存
      iError = myUpload.uploadFile(request);
      if(iError > 0){
       out.println("<script>alert('Success');</script>");  
      } else {
       out.println("<script>alert('Fail');</script>");  
      }
     }  %>
    <script type="text/javascript">
     function openPopUp(){
      self.location = 'excelDownload.jsp';
      window.open(self.location,'openWin','');
     }
     function uploadsave(){
      obj = document.formfile;
      document.formfile.action='uploadexcel.jsp?action=upload';  
      document.formfile.submit(); 
     } 
    </script>  <form method="post" enctype="multipart/form-data">
       Please select file(Chinese)
       <input type="file" >
       <br>
       <input type="button" value="Preview Excel" >   
       <input type="button" value="Upload" >
      </form>
     </body>
    </html>
    excelDownload.jsp
    <%@ page import="java.io.*" %><%
       response.setHeader("Content-disposition","attachment; filename=excel_ch.xls");
       FileInputStream fis=new FileInputStream("/web_project_path/fileupload/excel_ch.xls");
       OutputStream os=response.getOutputStream();
       int byteRead;
       while(-1 != (byteRead = fis.read())) {
         os.write(byteRead);
       }
       os.close();
       if (fis != null)
          fis.close();
    %> 
      

  8.   

    以下是一些官方的教學:
    http://jakarta.apache.org/commons/fileupload/using.html
    http://jakarta.apache.org/commons/fileupload/faq.html
     -----------------------------------------------------------查阅资料 2  commons-fileupload-1.1.1.jar
    commons-io-1.2.jar
    commons-beanutils.jar
    3个包Upload.html:<html>
    <head>
    <title>文件上传演示</title>
    </head>
    <body bgcolor="#3399CC" text="#000000" leftmargin="0" topmargin="40" marginwidth="0" marginheight="0">
    <center>
    <h1>文件上传演示</h1>
    <form method="POST" action="save.jsp" ENCTYPE="multipart/form-data">
    <table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF">
    <tr><td width="100%" colspan="2">
    文件1:<input size="40" type="file">
    </td></tr>
    <tr><td width="100%" colspan="2">
    文件2:<input size="40" type="file">
    </td></tr>
    <tr><td width="100%" colspan="2">
    文件3:<input size="40" type="file">
    </td></tr>
    </table>
    <br/><br/>
    <table>
    <tr><td align="center"><input type="submit" value="开始上传"/></td></tr>
    </table>
    </form>
    </center>
    </body>
    </html>save.jsp:<%@ page language="java"contentType="text/html;charset=GBK"%>
    <%@ page import="java.util.*"%>
    <%@ page import="java.io.*"%>
    <%@ page import="org.apache.commons.fileupload.*"%>
    <jsp:useBean   > </jsp:useBean><html>
    <head>
    <title>保存上传文件</title>
    </head>
    <%
    System.out.println("...save.jsp....");
    String msg = "";
    org.apache.commons.fileupload.DiskFileUpload fu = new org.apache.commons.fileupload.DiskFileUpload();   // 此处有修改。。
    // 设置允许用户上传文件大小,单位:字节
    fu.setSizeMax(100000000);
    // maximum size that will be stored in memory?
    // 设置最多只允许在内存中存储的数据,单位:字节
    fu.setSizeThreshold(4096);
    // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
    fu.setRepositoryPath("D:\\temp");
    //开始读取上传信息
    List fileItems = fu.parseRequest(request);
    %>
    <body bgcolor="#FFFFFF"text="#000000" leftmargin="0"topmargin="40"marginwidth="0" marginheight="0">
    <font size="6"color="blue">文件列表:</font>
    <center>
    <table cellpadding=0 cellspacing=1 border=1 width="100%">
    <tr>
    <td bgcolor="#008080">文件名</td>
    <td bgcolor="#008080">大小</td>
    </tr>
    <%
    // 依次处理每个上传的文件
    Iterator iter = fileItems.iterator();
    while (iter.hasNext()) {
      org.apache.commons.fileupload.FileItem item = (org.apache.commons.fileupload.FileItem) iter.next();  // 此处有修改。。
      //忽略其他不是文件域的所有表单信息
      if (!item.isFormField()) {
       String 
       long size = item.getSize();
       if((name==null||name.equals("")) && size==0)
       continue;
    %>
    <tr>
    <td><%=item.getName()%></td>
    <td><%=item.getSize()%></td>
    </tr>
    <%
       //保存上传的文件到指定的目录
       :','_');
       \\','_');
       
       java.io.File f1=new java.io.File("F:\\"+ name);                      // 此处有修改。。
       item.write(f1);                                                                        // 此处有修改。。
      }
    }
    %>
    </table><br/><br/>
    <a href="Upload.htm">返回上传页面</a>
    </center>
    </body>
    </html>就OK了
      

  9.   

    我不会啊。。你们可能没有加入三个组件吧。commons-fileupload-1.1.1.jar
    commons-io-1.2.jar
    commons-beanutils.jar
      

  10.   

    如果在命令行中执行的话可能要设置classpath(要写全路径如:目录\***.jar)