FastDFS 使用及遇到的问题

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

猜你喜欢

转载自blog.csdn.net/hochenchong/article/details/79967859