使用瀏覽器進行檔案上傳時,是使用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對應了,相信對現在的您來說已經不難。