今天我用commons-fileupload組件上傳文件,代碼是正確的,而且我把commons-fileupload-1.2.1.jar,commons-io-1.4.jar也導入到項目目項中,但總是出現這樣那樣的錯誤,讓我花了不少的時間,所以我把相關發出來,對有此類的問題的朋友有所幫助
如:
java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location]
……………………
在網上查了很多資料,后來總結了一下,如果你是在struts2項目中用commons-fileupload組件的話,那就應

該把修改web.xml,把原來的
<filter-mapping>
  <filter-name>struts</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
改為
<filter-mapping>
  <filter-name>struts</filter-name>
  <url-pattern>*.action</url-pattern>
 </filter-mapping>
而上傳頁面調用時直接用文件名調用(如upload.jsp)。struts2只處理 *.action 的請求。
或者
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
去掉也行

若是java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException錯誤
那就有可能是導包的問題,若用的是右擊項目,選擇屬性,然后導入相應的包,就有可能出顯此類的錯誤,解決方法是:把commons-fileupload-1.2.1.jar,commons-io-1.4.jar復制到到WEB-INF下的lib目錄中,雖然效果是一樣,但不會出錯了

附:
upload.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'upload.jsp' starting page</title>
</head>  
  <body>
  <form action="upload" method="post" enctype="multipart/form-data">
   用戶名:<input type="text" name="username"><br>
   密碼:<input type="password" name="password"><br>
   文件1:<input type="file" name="file1"><br>
    文件2:<input type="file" name="file2"><br> 
   <input type="submit" value="提交"><br>
  </form>
  </body>
</html>
UploadServlet.java

package com.test.servlet1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

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 UploadServlet extends HttpServlet {

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  DiskFileItemFactory factory = new DiskFileItemFactory();
  String path = request.getRealPath("/upload");
  // 設置傳輪輸文件的大小,當小于1024時,把文件存在茲盤上
  factory.setRepository(new File(path));
  factory.setSizeThreshold(1024 * 1024);
  ServletFileUpload upload = new ServletFileUpload(factory);
  try {
   List<FileItem> list = upload.parseRequest(request);
   for(FileItem item : list){
    if(item.isFormField()){
     String name = item.getFieldName();
     String value  = item.getString("GB2312");
     request.setAttribute(name, value);
    }else{
     String name = item.getFieldName();
     String value = item.getName();
     int start = value.lastIndexOf("\\");
     String fileName = value.substring(start+1);
     request.setAttribute(name, fileName);
     //item.write(new File(path,fileName));    
     OutputStream os = new FileOutputStream(new File(path,fileName));
     InputStream is = item.getInputStream();
     // 將文件is寫到os里
     byte[] buffer = new byte[400];
     int lenght = 0 ;
     while((lenght = is.read(buffer ))>0){
      os.write(buffer,0,lenght);
     }
     os.close();
     is.close();
    }
   }
  } catch (FileUploadException e) {
   // TODO Auto-generated catch block
   System.out.println("文件上傳出錯"+e.getMessage());
   e.printStackTrace();
  }
  request.getRequestDispatcher("upload/result.jsp").forward(request, response);
 }
}
result.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP 'result.jsp' starting page</title>
  </head> 
  <body>
 用戶名:${requestScope.username }
 密碼:${requestScope.password }
 文件1:${requestScope.file1 }
 文件2:${requestScope.file2 }
  </body>
</html>