Zhigang Zhang's Blog

an idealist's cheap talk

一种可控的上传与下载组件的设计

一、设计背景

文件的上传与下载是 Web 应用的常用功能,有很多组件可用于处理文件上传或下载,如这两篇文章:《ASP.NET中常用的文件上传下载方法》《Struts2实现文件上传和下载》就分别介绍了如何在 asp.net 和 javaee 两种架构下完成文件上传与下载的一种方法。但作为一个技术管理者,可能还会考虑下面这几个问题:

  1. 如何构建一个可复用的文件上传下载组件?
  2. 如何确保对每一个上传的文件进行有效的管理?
  3. 如何确保对每一个下载的文件进行合理的监控?
  4. 如何制订一个组织级的文件上传下载技术规范?

本文将以 JavaEE 为背景进行介绍,ASP.NET 可以类比进行参考。

二、基本思路

考虑可复用的需求、管理的需求及组织级规范的需求,可以沿着这个思路进行设计:从业务中抽离出上传下载,并将上传下载包装为标准接口供业务使用。

基本思路如下:

  1. 提供一个文件上传 tag(UT)取代原来的 input[type=file] 标签;
  2. UT 可设置一些必填属性,如业务代码、文件格式限定等,这些属性将随表单一起提交;
  3. 将上传文件从业务代码中抽离到一个独立的过滤器(UF)中;
  4. UF 负责从 request 中获取上传的文件,并将文件提交给文件存储器(FS);
  5. FS 负责保存文件,并返回文件标识(fileId);
  6. UF 删除 request 中的文件对象,并在 request 里添加 fileId;
  7. 业务逻辑利用 fileId 与业务进行关联,必要时可通过 FS 获取对应文件的详细信息及文件内容;
  8. 管理员通过文件管理器(FM)对文件进行管理;
  9. 提供一个文件下载 Servlet(DS),根据传入的 fileId 向浏览器输出对应的文件,并进行日志记录;

三、功能扩展

在基本思路的基础上,可以进行如下扩展:

  1. UT 可扩展为支持多文件上传;
  2. FS 可扩展为存取文件时自动进行加密解密处理;
  3. FM 可扩展为支持根据上传的文件查找对应的业务数据;
  4. DS 可扩展为根据功能权限和数据权限进行下载控制。

Posted: