博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FastDFS的Java客户端
阅读量:2074 次
发布时间:2019-04-29

本文共 8187 字,大约阅读时间需要 27 分钟。

前言

  • 前段时间搭建了一个FastDFS文件服务器想作为博客的图床,感觉服务器有点抗不太住,所以弃用了。但是既然搭都搭完了,不把个Java客户端弄出来总觉得自己的努力有点白费了。话不多说,上代码!

新建项目

新建SpringBoot工程,这里命名为:JavaFastDFSClient

编辑pom文件

在pom文件中引入如下jar包:

org.springframework.boot
spring-boot-starter-test
test
cn.bestwu
fastdfs-client-java
1.27
commons-io
commons-io
2.6

编辑配置文件

在resources目录下新建一个名为fdfs_client.conf的文件

connect_timeout = 60network_timeout = 60charset = UTF-8# Tracker配置文件中配置的http端口http.tracker_http_port = 9989http.anti_steal_token = nohttp.secret_key = FastDFS1234567890# Tracker服务器地址tracker_server = 你自己的IP:22122

如果按照博主之前的文章搭建的文件服务器,那么http.tracker_http_port的值应为9989,Tracker服务器地址的地址配置为自己的服务器IP端口,http.secret_key博主没有做配置,这里使用默认的就好。

FastDFS工具类

其中Slf4j可以去掉,博主为了方便直接进行了引入。

import lombok.extern.slf4j.Slf4j;import org.csource.common.NameValuePair;import org.csource.fastdfs.*;import org.springframework.core.io.ClassPathResource;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;/** * @author chihiro * @date 2019/04/08 */@Slf4jpublic class FastDFSClient {
static {
try {
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath(); ClientGlobal.init(filePath); } catch (Exception e) {
log.error("FastDFS Client Init Fail!", e); } } /** * 文件上传 * * @param file * @return 返回String[] [0]=groupName [1]=remoteFileName */ public static String[] upload(FastDFSFile file) {
log.info("File Name: " + file.getName() + "File Length:" + file.getContent().length); NameValuePair[] meta_list = new NameValuePair[1]; meta_list[0] = new NameValuePair("author", file.getAuthor()); long startTime = System.currentTimeMillis(); String[] uploadResults = null; StorageClient storageClient = null; String path = null; try {
storageClient = getTrackerClient(); uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list); log.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms"); if (uploadResults == null && storageClient != null) {
log.error("upload file fail, error code:" + storageClient.getErrorCode()); } String groupName = uploadResults[0]; String remoteFileName = uploadResults[1]; log.info("upload file successfully!!!" + "group_name:" + groupName + ", remoteFileName:" + " " + remoteFileName); return uploadResults; } catch (IOException e) {
log.error("IO Exception when uploadind the file:" + file.getName(), e); } catch (Exception e) {
log.error("Non IO Exception when uploadind the file:" + file.getName(), e); } return null; } public static FileInfo getFile(String groupName, String remoteFileName) {
try {
StorageClient storageClient = getTrackerClient(); return storageClient.get_file_info(groupName, remoteFileName); } catch (IOException e) {
log.error("IO Exception: Get File from Fast DFS failed", e); } catch (Exception e) {
log.error("Non IO Exception: Get File from Fast DFS failed", e); } return null; } /** * 文件下载 * * @param groupName * @param remoteFileName * @return */ public static InputStream downFile(String groupName, String remoteFileName) {
try {
StorageClient storageClient = getTrackerClient(); byte[] fileByte = storageClient.download_file(groupName, remoteFileName); InputStream ins = new ByteArrayInputStream(fileByte); return ins; } catch (IOException e) {
log.error("IO Exception: Get File from Fast DFS failed", e); } catch (Exception e) {
log.error("Non IO Exception: Get File from Fast DFS failed", e); } return null; } /** * 删除文件 * * @param groupName * @param remoteFileName * @return */ public static void deleteFile(String groupName, String remoteFileName) throws Exception {
StorageClient storageClient = getTrackerClient(); int i = storageClient.delete_file(groupName, remoteFileName); log.info("delete file successfully!!!"); } public static StorageServer[] getStoreStorages(String groupName) throws IOException {
TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); return trackerClient.getStoreStorages(trackerServer, groupName); } public static ServerInfo[] getFetchStorages(String groupName, String remoteFileName) throws IOException {
TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName); } public static String getTrackerUrl() throws IOException {
return "http://" + getTrackerServer().getInetSocketAddress().getHostString() + ":" + ClientGlobal.getG_tracker_http_port() + "/"; } private static StorageClient getTrackerClient() throws IOException {
TrackerServer trackerServer = getTrackerServer(); StorageClient storageClient = new StorageClient(trackerServer, null); return storageClient; } private static TrackerServer getTrackerServer() throws IOException {
TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); return trackerServer; }}

测试类

下面几个测试类实现了最基本的上传、下载以及删除功能。

import cn.hutool.core.io.FileUtil;import cn.hutool.core.util.ArrayUtil;import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import org.csource.fastdfs.FileInfo;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.io.File;import java.io.IOException;import java.io.InputStream;@RunWith(SpringRunner.class)@SpringBootTest@Slf4jpublic class FastDfsApplicationTests {
@Test public void upload() throws IOException {
File file = FileUtil.file("E:\\mnt\\file\\cms\\2019\\02\\22\\10.jpg"); String fileName = FileUtil.getName(file); String extName = FileUtil.extName(fileName); System.out.println(fileName + extName); byte[] bytes = FileUtil.readBytes(file); FastDFSFile fastDFSFile = new FastDFSFile(); fastDFSFile.setName(fileName); fastDFSFile.setExt(extName); fastDFSFile.setContent(bytes); fastDFSFile.setAuthor("333"); String[] fileAbsolutePath = FastDFSClient.upload(fastDFSFile); if (!ArrayUtil.isNotEmpty(fileAbsolutePath)) {
// 上传失败逻辑 System.out.println("上传失败"); } else {
//TODO 正式环境切换 String path = FastDFSClient.getTrackerUrl() + fileAbsolutePath[0] + "/" + fileAbsolutePath[1]; log.info(path); log.info(JSON.toJSONString(fileAbsolutePath)); } } @Test public void del() throws Exception {
FastDFSClient.deleteFile("group1","M00/00/00/rBEcC1ykgdiALaceAACZsuwCbKE956.jpg"); } @Test public void download() throws Exception {
InputStream inputStream = FastDFSClient.downFile("group1", "M00/00/00/rBEcC1ykgdiALaceAACZsuwCbKE956.jpg"); FileUtil.writeFromStream(inputStream,"E:\\mnt\\file\\6666.jpg"); } @Test public void getFile() throws Exception {
FileInfo fileInfo = FastDFSClient.getFile("group1", "M00/00/00/rBEcC1ykgdiALaceAACZsuwCbKE956.jpg"); log.info(JSON.toJSONString(fileInfo)); }}

后记

  • 这套代码博主自己测试可以使用,但未经深度测试,只能算作一个参考demo。
  • 若遇到其他Bug,请联系博主。

转载地址:http://jotmf.baihongyu.com/

你可能感兴趣的文章
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>
简述极大似然估计
查看>>
用线性判别分析 LDA 降维
查看>>
用 Doc2Vec 得到文档/段落/句子的向量表达
查看>>
使聊天机器人具有个性
查看>>
使聊天机器人的对话更有营养
查看>>
一个 tflearn 情感分析小例子
查看>>
attention 机制入门
查看>>
手把手用 IntelliJ IDEA 和 SBT 创建 scala 项目
查看>>
GAN 的 keras 实现
查看>>
AI 在 marketing 上的应用
查看>>
Logistic regression 为什么用 sigmoid ?
查看>>
Logistic Regression 为什么用极大似然函数
查看>>
LightGBM 如何调参
查看>>