FastDFS整合SpringBoot
搭建好fastDFS后当然就是要开始整合到项目中使用,这里使用FastDFS-Client和SpringBoot整合。 如果查看分布式文件系统原理和服务器搭建,可以点击查看。
工具
jdk | SpringBoot | FastDFS-Client | maven | FastDFS |
---|---|---|---|---|
11 | 2.2.2 | 1.27.1 | 3.6.3 | 6.06 |
FastDFS-Client
介绍: 在原作者YuQing与yuqih发布的java客户端基础上进行了大量重构工作,便于Java工作者学习与阅读。
主要特性:
- 对关键部分代码加入了单元测试,便于理解与服务端的接口交易,提高接口质量
- 将以前对byte硬解析风格重构为使用 对象+注解 的形式,尽量增强了代码的可读性
- 支持对服务端的连接池管理(commons-pool2)
- 支持上传图片时候检查图片格式,并且自动生成缩略图
- 在SpringBoot当中自动导入依赖
其他的可以看github介绍FastDFS-Client
整合开始
创建SpringBoot项目 依赖包:
<!--fastdfs-client-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.7</version>
</dependency>
jdk11可能会缺失一些包,需要导入Commons里包。但是jdk'8应该不用。
配置文件:
server:
port: 8888
### fdfs配置
fdfs:
so-timeout: 1501
connect-timeout: 601
thumb-image:
width: 150
height: 150
tracker-list:
# 可写多个tracker-server地址
- 192.168.xxx.xxx:22122
Application编辑
import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;
@SpringBootApplication
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastdfsFileApplication {
public static void main(String[] args) {
SpringApplication.run(FastdfsFileApplication.class, args);
}
}
单元测试:
@SpringBootTest
class FastdfsFileApplicationTests {
private final static Logger log = LoggerFactory.getLogger(FastdfsFileApplicationTests.class);
@Resource
private FastFileStorageClient fastFileStorageClient;
@Resource
private ThumbImageConfig thumbImageConfig;
/**
* 上传测试
*/
@Test
void testUpload() throws FileNotFoundException {
var path = "图片的路径";
var image = new File(path);
// 上传图片
var fastJpg = fastFileStorageClient.uploadFile(new FileInputStream(image),
image.length(), "jpg", null);
// 带分组的路径
log.info(fastJpg.getFullPath());
// 不带分组的路径
log.warn(fastJpg.getPath());
}
/**
* 测试删除相片
*/
@Test
void delImag(){
fastFileStorageClient.deleteFile("http://192.168.247.201/group1/M00/00/00/wKj3yV4u5cCAarJ1AA2CBRqtFgE245.jpg");
log.warn("ok");
}
/**
* 测试上传缩略图
*/
@Test
void testThumbImage() throws FileNotFoundException {
var path = "E:\\idea\\ServiceCode\\fastdfs-file\\src\\main\\resources\\static\\img\\upload.jpg";
var image = new File(path);
var thumbImage = fastFileStorageClient.uploadImageAndCrtThumbImage(new FileInputStream(image), image.length(), "jpg", null);
log.info("缩略图路径:" + thumbImageConfig.getThumbImagePath(thumbImage.getPath()));
log.warn("图片全路径:" + thumbImage.getFullPath());
log.debug("图片分组:" + thumbImage.getGroup());
log.error("打印信息:" + thumbImage.toString());
}
/**
* 文件信息
*/
@Test
public void testFileInfo(){
String uri = "http://192.168.247.201/group1/M00/00/00/wKj3yV4xQOSAPoyQAAzn60z3Hss404.jpg";
var filePath = uri.substring(uri.indexOf("group"));
var group = filePath.substring(0, filePath.indexOf("/"));
var path = filePath.substring(filePath.indexOf("/")+1);
log.warn("group:"+group+"<-->path:"+path);
var fileInfo = fastFileStorageClient.queryFileInfo(group,path);
log.info(fileInfo.toString());
}
}
由此可以自定义工具类
import com.github.tobato.fastdfs.domain.fdfs.ThumbImageConfig;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
/**
* @author 佐斯特勒
* <p>
* FastDFS包装类
* 用来包装操作FastDFSClient
* </p>
* @version v1.0.0
* @date 2020/1/28 1:14
* @see FastDFSWrapper
**/
@Component
@Slf4j
public class FastDFSWrapper {
@Resource
private FastFileStorageClient fastFileStorageClient;
@Resource
private ThumbImageConfig thumbImageConfig;
/**
* 文件上传
* 最后返回fastDFS中的文件名称;group1/M00/01/04/CgMKrVvS0geAQ0pzAACAAJxmBeM793.doc
*
* @param bytes 文件字节
* @param fileSize 文件大小
* @param extension 文件扩展名
* @return fastDfs路径
*/
public String uploadFile(byte[] bytes, long fileSize, String extension) {
var byteArrayInputStream = new ByteArrayInputStream(bytes);
var storePath = fastFileStorageClient.uploadFile(byteArrayInputStream, fileSize, extension, null);
log.info(storePath.getGroup() + "==" + storePath.getPath() + "======" + storePath.getFullPath());
return storePath.getFullPath();
}
/**
* 文件上传 原图+150x150缩略图
* @param bytes 文件字节
* @param fileSize 文件大小
* @param extension 文件扩展名
* @return fastDfs路径
*/
public String[] uploadThumbFile(byte[] bytes, long fileSize, String extension) {
var byteArrayInputStream = new ByteArrayInputStream(bytes);
var storePath = fastFileStorageClient.uploadImageAndCrtThumbImage(byteArrayInputStream, fileSize, extension, null);
log.info(storePath.getGroup() + "==" + thumbImageConfig.getThumbImagePath(storePath.getPath()) + "======" + storePath.getFullPath());
return new String[]{thumbImageConfig.getThumbImagePath(storePath.getFullPath()), storePath.getFullPath()};
}
/**
* 下载文件
* 返回文件字节流大小
* @param fileUrl 文件URL
* @return 文件字节
* @throws IOException .
*/
public byte[] downloadFile(String fileUrl) throws IOException {
fileUrl = fileUrl.substring(fileUrl.indexOf("group"));
var group = fileUrl.substring(0, fileUrl.indexOf("/"));
var path = fileUrl.substring(fileUrl.indexOf("/") + 1);
var downloadByteArray = new DownloadByteArray();
log.info("group:"+group+"--path:"+path);
return fastFileStorageClient.downloadFile(group, path, downloadByteArray);
}
/**
* 删除图片
* @param fileUrl 文件地址
*/
public void delFile(String fileUrl){
fastFileStorageClient.deleteFile(fileUrl);
}
}
大家可以参照上面的工具类来制作文件处理。更多的案例可以看FastDFS-Client作者的test/service
。FastDFS-Client源码
下面是我做的下案例
有上传图片和上传图片显示原图与缩略图的功能,还有下载图片功能 案例地址:gitee地址 觉得好别忘了点个赞(✪ω✪)(✪ω✪)
来源:oschina
链接:https://my.oschina.net/u/4449110/blog/3161944