一种可控的上传与下载组件的设计
一、设计背景
文件的上传与下载是 Web 应用的常用功能,有很多组件可用于处理文件上传或下载,如这两篇文章:《ASP.NET中常用的文件上传下载方法》、《Struts2实现文件上传和下载》就分别介绍了如何在 asp.net 和 javaee 两种架构下完成文件上传与下载的一种方法。但作为一个技术管理者,可能还会考虑下面这几个问题:
- 如何构建一个可复用的文件上传下载组件?
- 如何确保对每一个上传的文件进行有效的管理?
- 如何确保对每一个下载的文件进行合理的监控?
- 如何制订一个组织级的文件上传下载技术规范?
本文将以 JavaEE 为背景进行介绍,ASP.NET 可以类比进行参考。
二、基本思路
考虑可复用的需求、管理的需求及组织级规范的需求,可以沿着这个思路进行设计:从业务中抽离出上传下载,并将上传下载包装为标准接口供业务使用。
基本思路如下:
- 提供一个文件上传 tag(UT)取代原来的 input[type=file] 标签;
- UT 可设置一些必填属性,如业务代码、文件格式限定等,这些属性将随表单一起提交;
- 将上传文件从业务代码中抽离到一个独立的过滤器(UF)中;
- UF 负责从 request 中获取上传的文件,并将文件提交给文件存储器(FS);
- FS 负责保存文件,并返回文件标识(fileId);
- UF 删除 request 中的文件对象,并在 request 里添加 fileId;
- 业务逻辑利用 fileId 与业务进行关联,必要时可通过 FS 获取对应文件的详细信息及文件内容;
- 管理员通过文件管理器(FM)对文件进行管理;
- 提供一个文件下载 Servlet(DS),根据传入的 fileId 向浏览器输出对应的文件,并进行日志记录;
三、功能扩展
在基本思路的基础上,可以进行如下扩展:
- UT 可扩展为支持多文件上传;
- FS 可扩展为存取文件时自动进行加密解密处理;
- FM 可扩展为支持根据上传的文件查找对应的业务数据;
- DS 可扩展为根据功能权限和数据权限进行下载控制。