文件上傳(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定時輪流的方式取得會話中的進度值,並展示在頁面中;