使用瀏覽器進行檔案上傳時,是使用multipart/form-data編碼,然而Servlet容器並不會自動幫我們處理編碼,而必須由程式設計人員
自行處理,在這個部份,Struts中提供了檔案上傳的套件,使用它就可以輕易的解決檔案上傳的問題,首先請確定commons-
fileupload.jar有在WEB-INF/lib目錄下。
與檔案上傳相關的類別是在org.apache.struts.upload套件下,首先撰寫簡單的 ActionForm,以接收上傳的檔案:
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,將接收到的檔案儲存下來:
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對應了,相信對現在的您來說已經不難。 |