使用瀏覽器進行檔案上傳時,是使用multipart/form-data編碼,然而Servlet容器並不會自動幫我們處理編碼,而必須由程式設計人員 自行處理,在這個部份,Struts中提供了檔案上傳的套件,使用它就可以輕易的解決檔案上傳的問題,首先請確定commons- fileupload.jar有在WEB-INF/lib目錄下。
與檔案上傳相關的類別是在org.apache.struts.upload套件下,首先撰寫簡單的 ActionForm,以接收上傳的檔案:
- UploadForm.java
package onlyfun.caterpillar;
import javax.servlet.http.*; 
import org.apache.struts.action.*; 
import org.apache.struts.upload.*; 
public class UploadForm extends ActionForm { 
    private FormFile file;
    public void setFile(FormFile file) { 
        this.file = file; 
    }
    public FormFile getFile() { 
        return file; 
    }
    public void reset(ActionMapping mapping,
                      HttpServletRequest req) { 
        file = null; 
    } 
}檔案經由表單上傳至伺服器之後,會儲存為FormFile型態的物件,您可以藉由這個物件來取得上傳檔案的相關訊息,例如 getContentType()、getFileName()、getFileSize()等等,getFileData()可以取得檔案的位元陣列資 料,getInputStream()可以取得InputStream型態之物件,撰寫一個簡單的 Action,將接收到的檔案儲存下來:
- UploadAction.java
package onlyfun.caterpillar;
 
import java.io.*; 
import javax.servlet.http.*; 
import org.apache.struts.action.*; 
import org.apache.struts.upload.*; 
public class UploadAction extends Action { 
    public ActionForward execute(ActionMapping mapping, 
                                ActionForm form, 
                                HttpServletRequest request, 
                                HttpServletResponse response) 
                                  throws Exception { 
        UploadForm fileForm = (UploadForm) form; 
        FormFile file = fileForm.getFile(); 
        FileOutputStream fileOutput = new FileOutputStream(
           "/home/caterpillar/files/" + file.getFileName()); 
        fileOutput.write(file.getFileData()); 
        fileOutput.flush(); 
        fileOutput.close(); 
        file.destroy() ;  // destroy temperaty file
        return mapping.findForward("success"); 
    } 
}可以這麼撰寫表單,記得設定enctype屬性為multipart/form-data:
 ...
<form name="uploadForm"
enctype="multipart/form-data"
method="post" action="/strutsapp/upload.do">
<input type="file" name="file"> <br>
<input type="submit"value="上傳">
</form>
...
      
      <form name="uploadForm"
enctype="multipart/form-data"
method="post" action="/strutsapp/upload.do">
<input type="file" name="file"> <br>
<input type="submit"value="上傳">
</form>
...
剩下的就是配置struts-config.xml中的ActionForm與Action對應了,相信對現在的您來說已經不難。

