ITEEDU

档案上传

如 果您想要进行档案上传的动作,则您可以使用实作 org.springframework.web.multipart.MultipartResolver 介面的类别,Spring 提供 org.springframework.web.multipart.commons.CommonsMultipartResolver 与 org.springframework.web.multipart.cos.CosMultipartResolver,分别支援 Commands FileUpload 及 COS FileUpload。

举个实际的例子,假设您设计了一个 FileForm 类别:

•      FileForm.java
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 时注册,例如:

•      UploadController.java
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 来定义:

•      mvc-config.xml
<?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:

•      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 则设 计如下:

•      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 档案。