导言:在实际web 项目中,我们常常会碰到这种情况,在后台管理平台上,后台管理人员需要上传一些文件,例如促销活动图片以及活动文案文件到服务器上,然后推广到产品宣传首页,完成动态部署产品相关销售活动的功能。通常,在大流量情况下,我们会考虑把文件存放到单独的文件服务器上,利用第三方分布式文件系统完成相关文件服务器的部署工作,例如我个人做过利用FastDFS+Solr+zeroMQ框架完成了从服务器端到客户端的分布式文件系统管理系统的搭建工作。那么在硬件环境相对匮乏的情况下,如何去处理这些文件的存放与查找呢?这就是本文所要描述的。
web文件管理,主要涉及到以下几个方面:
- 文件的上传
- 文件存储的组织方式
- web文件获取方式
其中,尤其以文件存储的组织方式为要。
首先定义一个类,用于存储网络文件到本地,建立起合适的文件组织结构,并提供web访问接口。该类命名为FileManager.java,首先定义类的构造方式,与类的私有变量等
public class FileManager {
public static final String ERROR = "ERROR";
public static final String NONE = "NONE";
//根目录
private String basePath;
/*//自定义存储根路径
public FileManager(String basePath){
this.basePath = basePath;
}*/
//默认存储根路径
public FileManager(){
this.basePath = this.getClass().getResource("/").getPath().split("webapps")[0]+"webapps/file";
}
public String getBasePath(){
return this.basePath;
}
.
.
.
}
这里讲自定义存储路径的方式注释了,而是采用固定的文件夹来存储文件,此处是指tomcat/webapps/file目录。需要说明的是,此处的file目录为一个空的web工程部署文件夹,如果只是新建一个空的文件夹用于存储文件,是无法通过链接访问到其中的文件的。
再就提到存储文件的组织方式了,为了不使单个文件夹下的文件数目过多,采用文件名的哈希值的后16位构建深度为4的文件夹结构来存储各类文件。原则上,此处饱和情况下可创建2^16个子文件夹用于存储文件。根据文件名构建文件存储路径的方法代码如下:
/**
* 根据hash算法,确定存放目录
* @param filename
* @return
*/
private String getPath(String filename){
try{
//得到文件名的hashCode的值,取二进制后16位,文件夹深度为4
int hashcode = filename.hashCode();
String dir_suffix = "/"+(hashcode & 0xf)+"/"+((hashcode & 0xf0) >> 4)+"/"+((hashcode & 0xf00) >> 8)+"/"+((hashcode & 0xf000) >> 12);