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