檔案上傳


使用瀏覽器進行檔案上傳時,是使用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>
 ...

剩下的就是配置struts-config.xml中的ActionForm與Action對應了,相信對現在的您來說已經不難。