FastDFS是一款类似Google FS的开源分布式文件系统,是纯C语言开发并且开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
如上所述,我们可以使用FastDFS来储存图片或做与服务器的文件上传下载交互。
服务器端FastDFS如何简便安装和Springboot如何集成开发可以看上一篇转载文章
1、由于在maven中央仓库中没有FastDFS的jar包,所以需要自己先下载源码
我的github下载地址:https://github.com/554197854/fastdfs-client-java
上面REAM.ME有相关介绍,可以看一看
2、用eclipse或者idea打开下载的文件项目并且使用maven的install命令安装到本地仓库
查看本地仓库,可以看到已经成功安装
3、在自己需要使用FastDFS的项目中添加如下依赖
<dependency>
<groupId>org.csourcegroupId>
<artifactId>fastdfs-client-javaartifactId>
<version>1.27-SNAPSHOTversion>
dependency>
4、在项目中创建一个xxx.conf的配置文件 名字自取conf结尾
配置文件中可以配置的内容可以参考我的github中README.md参看
xxx.conf中必须要配置的项目如下
tracker_server=192.168.31.99:22122 //必须配置一个tracker的服务器ip地址及端口,多台则可以配多个
5、测试代码
package com.shop.fastdfs;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.junit.Test;
import java.io.IOException;
/**
* @author N
* @create 2018/12/25 -- 19:59
* @email [email protected]
*/
public class FastDfsTest {
@Test
public void testUpload() throws Exception{
try {
//初始化配置文件,需要conf的真实地址,并且需要抛出异常
ClientGlobal.init("D:\\workspace_IDEA\\Shop-Project\\shop-manager\\shop-manager-web\\src\\main\\resources\\resource\\client.conf");
//创建Tracker客户端
TrackerClient trackerClient = new TrackerClient();
//创建Tracker服务器连接对象
TrackerServer trackerServer = trackerClient.getConnection();
//创建一个StoreStorage服务器对象,没有配置则返回null,如果在配置文件中有配置:trackerClient.getStoreStorage()
StorageServer storageServer = null;
//通过上述的两个服务器对象,得到一个Storage客户端
StorageClient storageClient = new StorageClient(trackerServer,storageServer);
//使用Storage客户端操作文件上传下载
//上传本地图片
String[] strings = storageClient.upload_file("D:\\default_icon.png", "png", null);
for(String string:strings){
System.out.println(string);
}
//使用完后关闭
//storageServer.close(); storageServer为null 所以不需要close
trackerServer.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
运行成功:
如果出现如下错误,应该是服务端端口ip配置错误。
进入docker容器查看配置文件,发现之前在CentOS 虚拟机上使用docker安装服务端时端口号错误
192.168.31.99:22122 写成了192.168.99.31:22122
package com.shop.fastdfs;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
/**
* @author N
* @create 2018/12/26 -- 1:39
* @email [email protected]
*/
public class FastDFSUtils {
private TrackerClient trackerClient = null;
private TrackerServer trackerServer = null;
private StorageServer storageServer = null;
//使用StorageClient1进行上传
private StorageClient1 storageClient1 = null;
public FastDFSUtils(String conf) throws Exception {
//获取classpath路径下配置文件"fdfs_client.conf"的路径
//conf直接写相对于classpath的位置,不需要写classpath:
String configPath = this.getClass().getClassLoader().getResource(conf).getFile();
ClientGlobal.init(configPath);
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageServer = trackerClient.getStoreStorage(trackerServer);
storageClient1 = new StorageClient1(trackerServer, storageServer);
}
public String uploadFile(byte[] file_buff, String file_ext_name,NameValuePair[] meta_list) throws Exception { //远程上传
String result = storageClient1.upload_file1(file_buff, file_ext_name, meta_list);
result="http://192.168.31.99:8080/"+result;//我的服务器地址+返回的图片存储路径,服务器地址也可以改为从配置文件读取
return result;
}
public String uploadFile(String local_filename, String file_ext_name, NameValuePair[] meta_list) throws Exception { //本地上传
String result = storageClient1.upload_file1(local_filename, file_ext_name, meta_list);
result="http://192.168.31.99:8080/"+result; //我的服务器地址+返回的图片存储路径,服务器地址也可以改为从配置文件读取
return result;
}
}
测试使用:
@Test
public void testUtils() throws Exception{
FastDFSUtils fastDFSUtils =new FastDFSUtils("resource/client.conf");
String file = fastDFSUtils.uploadFile("D:\\default_icon.png", "png", null);
System.out.println(file);
}