如 果您想要进行档案上传的动作,则您可以使用实作 org.springframework.web.multipart.MultipartResolver 介面的类别,Spring 提供 org.springframework.web.multipart.commons.CommonsMultipartResolver 与 org.springframework.web.multipart.cos.CosMultipartResolver,分别支援 Commands FileUpload 及 COS FileUpload。
举个实际的例子,假设您设计了一个 FileForm 类别:
package onlyfun.caterpillar; public class FileForm { private String name; private byte[] contents; public void setName(String name) { this.name = name; } public void setContents(byte[] contents) { this.contents = contents; } public String getName() { return name; } public byte[] getContents() { return contents; } }
FileForm 中接受档案上传的属性型态是 byte 阵列,使用者上传的档案可以藉由 org.springframework.web.multipart.support.ByteArrayMultipartFileEditor 将之 转换为 byte 阵列并设定给 FileForm,这必须在定义 Controller 时注册,例如:
package onlyfun.caterpillar; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.validation.BindException; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.multipart. support.ByteArrayMultipartFileEditor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet. mvc.SimpleFormController; public class UploadController extends SimpleFormController { private String path; public UploadController() { setCommandClass(FileForm.class); } protected ModelAndView onSubmit( HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { FileForm form = (FileForm) command; String storedPath = path + System.getProperty("file.separator") + form.getName(); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( new FileOutputStream(storedPath)); bufferedOutputStream.write(form.getContents()); bufferedOutputStream.close(); return new ModelAndView(getSuccessView(), "filename", form.getName()); } protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { super.initBinder(request, binder); binder.registerCustomEditor( byte[].class, new ByteArrayMultipartFileEditor()); } public void setPath(String path) { this.path = path; } }
依以上的设定,档案上传后会储存在指定的目录下,要使用档案上传的功能,您必须在定义档中 加入 MultipartResolver 的定义,您可以选择使用 CommonsMultipartResolver 或 CosMultipartResolver,例如以下使用 CommonsMultipartResolver 来定义:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN""http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="urlMapping" class="org.springframework.web.servlet. → handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/index.do"> indexController </prop> <prop key="/upload.do"> uploadController </prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet. → view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <bean id="indexController" class="org.springframework.web.servlet. → mvc.ParameterizableViewController"> <property name="viewName"> <value>index</value> </property> </bean> <bean id="multipartResolver" class="org.springframework.web.multipart. → commons.CommonsMultipartResolver"> <property name="maxUploadSize"> <value>1000000</value> </property> </bean> <bean id="uploadController" class="onlyfun.caterpillar.UploadController"> <property name="formView"> <value>form</value> </property> <property name="successView"> <value>success</value> </property> <property name="path"> <value>C:\upload</value> </property> </bean> </beans>
在定义档中,藉由设定 UploadController 的"path"属性为"C:\upload",表示上传后的档案会储 存在 C:\upload 目录之中,接着设计一个 index.jsp:
<%@page contentType="text/html"%> <%@page?pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Upload Page</title> </head> <body> <form name="uploadForm" enctype="multipart/form-data" action="/FileUploadDemo/upload.do" method="POST"> 上载后档案名称: <input name="name" type="text"/><br> 选择档案: <input name="contents" type="file"/><br> <input type="submit" value="Submit"/> </form> </body> </html>
在这个页面中可以设定上传后的档案名称,并可以选择所要上传的档案名称,success.jsp 则设 计如下:
<%@page?contentType="text/html"%> <%@page?pageEncoding="UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Upload Success</title> </head> <body> <h1>File: ${filename} upload successfully.</h1> </body> </html>
这个专案 使用到相 依的 Commands FileUpload ,所以 您要在 lib 目录 中 包括 commons-fileupload.jar 档案。