FastDFS 使用及遇到的问题
前言
最近在跟着视频做项目,其中学习到使用 FastDFS 作为图片服务器的文件系统。以下是百度上关于 FastDFS 的介绍:
FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS 是国内大神写的,通过 ta 的注释得知 ta 是 Happy Fish / YuQing。
在学习的过程之中,我也遇到了一些问题,再此记录以下。
前期准备
一台配置好 FastDFS 的 Linux 虚拟机,这里我并没有自己配置,而是使用别人配置好的虚拟机,据说配置起来还比较麻烦,而且这些一般是运维做的事情。待以后有空在跟着教程自己配置一遍。
FastDFS 客户端的 jar 包,这里推荐从作者的 Github 上下载 maven 项目安装到本地,目前最新版是 1.27-SNAPSHOT 。https://github.com/happyfish100/fastdfs-client-java
顺带一提,在 README.md 已介绍了使用方法,所以使用起来还是相当方便。
FastDFS 使用测试
在 maven 项目 pom.xml 中添加依赖
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
创建配置文件
在 resources 目录线下创建 conf 文件夹,在 conf 文件夹下创建 fastdfs_client.conf 文件,例如的内容为(这里仅仅是以我的学习为例,具体请参照 FastDFS 作者的说明文档):
tracker_server=192.168.229.133:22122
因为除了 tracker_server,其它配置项都是可选的。这里我们仅配置 tracker_server
创建一个测试类,代码如下
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.junit.Test;
public class FastDFSTest {
@Test
public void testUpload() throws Exception {
// 使用全局对象加载配置文件
ClientGlobal.init("conf/fastdfs_client.conf");
// 创建 TrackerClient 对象,直接 new 就可以了
TrackerClient trackerClient = new TrackerClient();
// 通过 TrackerClient 获得一个 TrackerServer 对象
TrackerServer trackerServer = trackerClient.getConnection();
// 创建一个 StorageServer 的引用,可以是 null
StorageServer storageServer = null;
// 创建一个 StorageClient,参数需要 TrackerServer,StorageServer。相当于拿到服务器的 IP 和端口号
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 使用 StorageClient 上传文件,返回保存信息。upload_file 方法中的三个参数,分别是文件路径,文件后缀名以及元数据
String[] strings = storageClient.upload_file("D:\\test\\123.jpg", "jpg", null);
// 打印结果
for (String string : strings) {
System.out.println(string);
}
}
}
输出结果
如果一切顺利的话,输入的结果应该是类似于以下内容:
group1
M00/00/00/wKjlhVrUqe6AfSHDAAHq2__LLfA498.jpg
此时该上传好的访问路径为:
192.168.229.133/group1/M00/00/00/wKjlhVrUqe6AfSHDAAHq2__LLfA498.jpg
学习过程之中遇到的问题
问题一:
java.io.FileNotFoundException: D:\test\123.jpg (文件名、目录名或卷标语法不正确。)
原因可能是:在 win10 下直接复制文件路径(据说 win8 下也是,win7 不会),会有隐藏字符,所以会报这个错误。
解决方法:手动敲路径
问题二:
org.csource.common.MyException: getStoreStorage fail, errno code: 2
at org.csource.fastdfs.StorageClient.newWritableStorageConnection(StorageClient.java:1629)
at org.csource.fastdfs.StorageClient.do_upload_file(StorageClient.java:639)
at org.csource.fastdfs.StorageClient.upload_file(StorageClient.java:120)
at org.csource.fastdfs.StorageClient.upload_file(StorageClient.java:91)
at org.csource.fastdfs.StorageClient.upload_file(StorageClient.java:73)
原因:图片服务器中的相关服务未启动或者是配置有问题(参考链接:fastdfs的一些常见错误 getStoreStorage fail, errno code: 2)
解决方法:因为我使用的是别人已经配置好的虚拟机,在开机时已经自动启动相关的服务,所以考虑的是配置有问题。通过命令:
vi /etc/fdfs/storage.conf
,然后修改里面的 tracker_server 地址为上面 fastdfs_client.conf 文件中的地址:tracker_server=192.168.229.133:22122
,重启服务,问题解决。
后记
看视频学习时,总觉得自己会了,而自己动手时,就会知道,其实不了解的东西还有很多。不过也在出现问题后,一边解决一边进步。
在实践中成长!
HochenChong
时间:2018-4-16