fastdfs两种java客户端的使用及踩坑
fastdfs两种java客户端的使用及踩坑
fastdfs官方给出了fastdfs-client-java,当然你可以直接将源码打成jar包上传到本地的maven仓库,如果你的maven clean install命令不是特别给力,一个劲报错,不嫌麻烦的话,可以直接在你的代码中引入源码(当然这种方式不是特别推荐),网上给出了几种客户端的使用,现在整理两种客户端的使用及出现的问题,供参考
基于com.github.tobato
你可以在maven中央仓库找到这个客户端的client,只需要在pom.xml中引入即可
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
这个客户端是给予配置的,需要在工程上建一个配置类,如下:
import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;
@Configuration
@Import(FdfsClientConfig.class)
// 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastClientImporter {
}
然后在application.yml中配置必要的链接等信息:
fdfs:
so-timeout: 15001 # 超时时间
connect-timeout: 6001 # 连接超时时间
pool:
max-total: 200 # 连接池最大数量
max-total-per-key: 50 # 单个tracker最大连接数
max-wait-millis: 5000 # 连接耗尽最大等待时间 毫秒
thumb-image: # 缩略图
width: 60
height: 60
tracker-list: xxx.xx.xx.xx:2007
很简单地写个测试类:
@Test
public void testUpload() throws FileNotFoundException {
// 要上传的文件
File file = new File("C:\\Users\\baocz\\Desktop\\test2.jpg");
// 上传并保存图片,参数:1-上传的文件流 2-文件的大小 3-文件的后缀 4-可以不管他
StorePath storePath = this.storageClient.uploadFile(
new FileInputStream(file), file.length(), "jpg", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
}
然后就可以使用返回的结果拼装路径访问图片了:
group1
M00/00/00/Cu1uBmGknlWAcBg_AAUxV4b6EoA734.jpg
这个客户端使用还是挺简单的,我遇到的主要的问题是,一直报connect time out。就是连不上tracker,我原来以为是22122的端口没开,所以就在服务器上开了端口,但是还是不行。查了各种资料,试了几次还是不行,大家可以看到上面我给的tracker-list配置项,我把端口改成了2007,是不再使用原来的22122,就可以了,原来我们的网络对5位数的端口有限制,好坑。。。
基于源码的方式,即org.csource
像我上面说的,你可以直接把源码打成jar,上传到你本地的仓库,然后依赖上,你也可以直接把源码引入自己的代码中,如果允许这样做。为了测试我是直接把源码引入自己的代码中的,源码clone下来就成了。
https://github.com/happyfish100/fastdfs-client-java.git
其实,你会发现,这个client已经能够实现我们上传下载的需求了。如果引入自己的代码中,注意两个配置文件。
测试代码如下:
public static void main(String[] args) throws IOException, MyException {
//1.获取配置文件路径
String configNmae = FastDFSTest.class.getResource("/fdfs/fdfs_client.conf").getPath();
System.out.println(configNmae);
//2.加载配置文件
ClientGlobal.init(configNmae);
// 3.创建一个TrackerClient对象
TrackerClient trackerClient = new TrackerClient();
// 4.通过TrackerClient对象获得TrackerServer对象
//fastdfs新版本由connection更改为getTrackerServer方法
TrackerServer trackerServer = trackerClient.getTrackerServer();
// 5.创建StorageServer的引用,null就可以了
StorageServer storageServer = null;
// 6.创建一个StorageClient对象,其需要两个参数,一个是TrackerServer,一个是StorageServer
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 7.使用StorageClient对象上传文件(图片)
// 参数1:文件名,参数名:扩展名,不能包含".",参数3:文件的元数据,保存文件的原始名、大小、尺寸等,如果没有可为null
String[] strings = storageClient.upload_file("C:\\Users\\baocz\\Desktop\\test2.jpg", "jpg", null);
for (String string : strings) {
System.out.println(string);
}
}
我在测试中发现,只修改tracker的端口号还是会报xxx.xxx.xxx.xx:23000链接不上,当然这时候需要把storage的端口号也改小,这是因为,tracke会去连接storage决定文件存放的目录,所以如果你们的网络策略也是限制5位数的端口号,需要把tracker和storage的端口号都改小,然后执行下
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
前提是,你之前的安装测试都没有问题。