文件上传(Upload)
WebMVC模块针对文件的上传处理以及对上传的文件操作都非常的简单,通过注解就轻松搞定:
-
@FileUpload:声明控制器方法需要处理上传的文件流;
无参数,需要注意的是文件上传处理的表单enctype属性:
<form action="/demo/upload" method="POST" enctype="multipart/form-data"> ...... </form>
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定时轮循的方式获取会话中的进度值,并展示在页面中;