Dorado 9 : UploadAction 0.x.x(DCUG)

在dorado-home中的servlet-context.xml中添加xml配置:

<bean class="com.bstek.dorado.uploader.DefaultUploadProcessor">
	<property name="uploadDir" value="{webapp.tmpdir}/upload"></property>
</bean>

配置上传到某个目录,支持3种类型表达式: 

表达式描述
{webapp.home}web应用的根目录,相当于ServletContext.getRealPath("/")
{webapp.tmpdir}web应用的缓存目录,相当于ServletContext.getAttribute("javax.servlet.context.tempdir")
{env:java.io.tmpdir}取java环境变量里的值,相当于System.getProperty("java.io.tmpdir")

我们也可以自定义一个类来可以实现UploadProcessor接口,范例代码如下:

public Object MyUploadProcessor implements UploadProcessor {
 
	@Override
	public void process(MultipartFile file, HttpServletRequest req,
			HttpServletResponse res) {
		String uploadFolder = xxx;
		file.transferTo(new File(uploadFolder));
		return null;
	}
	
}

并servlet-context.xml中添加配置:

<bean class="com.bstek.dorado.uploader.samples.MyUploadProcessor" />

处理文件名中文乱码,则在web.xml里加入

<filter>
	<filter-name>CharacterEncodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

下面我们根据使用场景分单文件及时上传与多文件队列上传两种形式说明UploadAction的基本使用:

单文件即时上传

从最简单的开始,我们希望通过一个按钮触发文件上传工作,在View中添加一个Button和一个UploadAction控件:

只要将按钮的action设置为对应的UploadAction对象即可。

单击按钮就能出现文件选择框。并上传文件。

如果我们还想在客户端获取或查看被上传文件的详细信息,可以通过UploadAction的files属性获取,详细说明将在后面补充。

多文件队列上传

多文件上传的功能与单文件非常类似,只要将将UploadAction的autoUpload设置为false:

autoUpload设置为false后,文件不会立即上传,通过添加按钮添加的文件都临时添加到UploadAction的files属性中,直到你调用UploadAction的start()方法才启动批量文件上传机制。

范例参考:http://bsdn.org/projects/dorado7/deploy/sample-center/com.bstek.dorado.sample.Main.d#157451

详细说明

UploadAction控件的基本属性和Action(DCUG)类似,不再重复叙述,下面我们只针对UploadAction中特有的属性做详细说明。

关于参数处理

客户端向UploadProcessor中传递参数(multipartParams)

在文件上传的同时如果我们还希望能同时提供几个参数上传到服务器端的文件保存的Java类中,会极大的方便业务的处理。UploadAction也对此提供了支持,在UploadAction中参数是通过multipartParams定义的,例如你可以在UploadAction的onFilesAdded中定义: 

// @Bind actionUpload.onFilesAdded
!function(self, arg) {
	self.set("multipartParams", {param1:"value1", param2:"value2"});
}

然后对应的服务器端的Java类中就可以通过org.springframework.web.multipart.MultipartHttpServletRequest类的getParameter(String paramName)方法获取到对应的参数值 

	public Object process(MultipartFile file, HttpServletRequest req,
			HttpServletResponse res) {
		 ...
	     MultipartHttpServletRequest multiPartReq = (MultipartHttpServletRequest) req;
	     String param1 = multiPartReq.getParameter("param1");
	     String param2 = multiPartReq.getParameter("param2");
		 ...
	}
UploadProcessor端向客户端传递参数

在UploadProcessor端通过processor方法中的返回值向客户端输出信息,可以直接输出字符串:

return = "aaa";

之后在View中对应的UploadAction的onFileUploaded中添加代码:

//@Bind #actionUpload.onFileUploaded
!function(self,arg){
	var returnValue = arg.response.response;//获取Response中返回的信息
}

也可以直接返回map对象:

Map data = new HashMap();
data.put("key1", "value1");
data.put("key2", "value2");
return data;

之后浏览器端View中的UploadAction的onFileUploaded事件中就可以利用JSON工具类转换(本例用Dorado提供的JSON工具类) 

//@Bind #actionUpload.onFileUploaded
!function(self,arg){
	var returnValue = dorado.JSON.parse(arg.response.response);
	alert(returnValue.key1);
}

关于files属性

用UploadAction上传的文件对应的JS对象就是HTML中的File,由于UploadAction支持多文件批量上传,因此在UploadAction中就提供了files属性存储这些File对象。 

var files = uploadAction.get("files");
files.each(function(file){
	var size = file.size;
	var fileName = file.name;
	alert(dir+"\n"+value+"\n"+fileName);
});

关于maxFileSize

该属性用于设置最大允许上传的文件的文件大小

 关于Filters

Filters是UploadAction的一个子对象,可以通过它设置允许上传的文件类型,例如:只允许上传jpg,gif,png类型的文件: