ITEEDU

Struts Gossip: 档案上传

使用浏览器进行档案上传时,是使用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对应了,相信对现在的您来说已经不难。