FastDFS简介
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
图片上传在公司项目中时刻可以看到,然而图片的存储位置需要合理的设置,fastdfs帮我们解决了这个问题。本文主要讲述java集成fastdfs,fastdfs搭建直接按照该网址搭建https://www.cnblogs.com/chiangchou/p/fastdfs.html。
公司集成的fastdfs需要的配置
#多个trackerServer用逗号隔开,图片上传的服务地址
fastdfs.trackerServers=192.168.1.31:22122
#图片上传后访问的地址
fastdfs.url=http://192.168.1.30
集成fastdfs需要的依赖
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
fastdfs核心类是StorageClient,上传下载都是StorageClient的方法完成,因此获取StorageClient的实例对象是第一步。
private StorageClient getClient() {
Map<String, Object> data = createClient(true);
StorageClient client = (StorageClient) data.get("client");
return client;
}
/**
* 根据参数创建StorageClient对象
*
* @param isClient 需要实例化的StorageClient类型
*/
private Map<String, Object> createClient(boolean isClient) {
try {
// ClientGlobal.init(conf_filename);
//获取配置中fastdfs上传服务节点
String servers = FileConfig.getConfig("fastdfs.trackerServers");
ClientGlobal.initByTrackers(servers);
Map<String, Object> data = new HashedMap();
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageServer storageServer = null;
if (isClient) {
StorageClient client = new StorageClient(trackerServer, storageServer);
data.put("client", client);
}
return data;
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return null;
}
获取了client对象,直接调用client的方法即可实现文件上传
/**
* 根据带路径文件名上传文件
*
* @param fileBytes 文件二进制流
* @param fileName 文件名
*/
public String[] upload(byte[] fileBytes, String fileName) {
String[] fileIds = uploadFile(fileBytes, fileName, true);
return fileIds;
}
private String[] uploadFile(byte[] fileBytes, String fileName, boolean isBytes) {
try {
StorageClient client = getClient();
String[] arr = fileName.split("\\.");//文件都是xxx.xxx的格式
if (arr.length < 2) {
return null;
}
String[] fileIds = null;
if (isBytes) {
fileIds = client.upload_file(fileBytes, arr[arr.length - 1], null);
} else {
fileIds = client.upload_file(fileName, arr[arr.length - 1], null);
}
return fileIds;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return null;
}
如此就完成了文件上传的功能,如果需要文件上传直接调用文件上传功能就可以了,上传后的文件访问地址:
/**
* 根据文件名获取文件访问地址
*/
public static String getFileUrl(String filePath) {
String url = FileConfig.getConfig("fastdfs.url");
return url + filePath;
}