如 果您想要进行档案上传的动作,则您可以使用实作 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 档案。