WebMVC模块针对文件的上传处理以及对上传的文件操作都非常的简单,通过注解就轻松搞定:@FileUpload:声明控制器方法需要处理上传的文件流;无参数,需要注意的是文件上传处理的表单enctype属性:
......
IUploadFileWrapper:上传文件包装器接口,提供对已上传文件操作的一系列方法;
示例代码:
@Controller
@RequestMapping("/demo)
public class UploadController {
// 处理单文件上传
@RequestMapping(value = "/upload", method = Type.HttpMethod.POST)
@FileUpload
public IView doUpload(@RequestParam
IUploadFileWrapper file) throws Exception {
// 获取文件名称
file.getName();
// 获取文件大小
file.getSize();
// 获取完整的文件名及路径
file.getPath();
// 获取文件Content-Type
file.getContentType();
// 转移文件
file.transferTo(new File("/temp", file.getName()));
// 保存文件
file.writeTo(new File("/temp", file.getName());
// 删除文件
file.delete();
// 获取文件输入流对象
file.getInputStream();
// 获取文件输出流对象
file.getOutputStream();
return View.nullView();
}
// 处理多文件上传
@RequestMapping(value = "/uploads", method = Type.HttpMethod.POST)
@FileUpload
public IView doUpload(@RequestParam
IUploadFileWrapper[] files) throws Exception {
// ......
return View.nullView();
}
}
文件上传相关配置参数:
#-------------------------------------
# 文件上传配置参数
#-------------------------------------
# 文件上传临时目录,为空则默认使用:System.getProperty("java.io.tmpdir")
ymp.configs.webmvc.upload_temp_dir=
# 上传文件大小最大值(字节),默认值:-1(注:10485760 = 10M)
ymp.configs.webmvc.upload_file_size_max=
# 上传文件总量大小最大值(字节), 默认值:-1(注:10485760 = 10M)
ymp.configs.webmvc.upload_total_size_max=
# 内存缓冲区的大小,默认值: 10240字节(=10K),即如果文件大于10K,将使用临时文件缓存上传文件
ymp.configs.webmvc.upload_size_threshold=
# 文件上传状态监听器,可选参数,默认值为空
ymp.configs.webmvc.upload_file_listener_class=
文件上传状态监听器(upload_file_listener_class)配置:
WebMVC模块的文件上传是基于Apache Commons FileUpload组件实现的,所以通过其自身提供的ProgressListener接口即可实现对文件上传状态的监听;
示例代码:实现上传文件的进度计算;
public class UploadProgressListener implements ProgressListener {
public void update(long pBytesRead, long pContentLength, int pItems) {
if (pContentLength == 0) {
return;
}
// 计算上传进度百分比
double percent = (double) pBytesRead / (double) pContentLength;
// 将百分比存储在用户会话中
WebContext.getContext().getSession().put("upload_progress", percent);
}
}将该接口实现类配置到 ymp.configs.webmvc.upload_file_listener_class 参数中;
通过Ajax定时轮循的方式获取会话中的进度值,并展示在页面中;