FastDFS与Springboot集成

mac2025-02-13  8

整合到Springboot项目流程 注意:必须是Springboot项目

1、添加pom依赖

<dependency>     <groupId>com.github.tobato</groupId>     <artifactId>fastdfs-client</artifactId>     <version>1.25.2-RELEASE</version> </dependency

> 2、将Fdfs配置引入项目 我将注解配置加在springboot的入口类中:@Import(FdfsClientConfig.class)

@Import(FdfsClientConfig.class) @SpringBootApplication public class JingtongApplication {     public static void main(String[] args) {         SpringApplication.run(JingtongApplication.class, args);     } }

3、在spring配置文件中加入fdfs相关配置 根据项目当中使用配置文件类型(.yml和.properties选择其中一个),加入相应的配置。

application.yml fdfs:   soTimeout: 1500   connectTimeout: 600   thumbImage:             #缩略图生成参数     width: 150     height: 150   trackerList:            #TrackerList参数,支持多个     - 192.168.0.201:22122     - 192.168.0.202:22122  application.properties fdfs.soTimeout=1500 fdfs.connectTimeout=600 fdfs.thumbImage.width=150 fdfs.thumbImage.height=150 fdfs.trackerList[0]=192.168.0.201:22122 fdfs.trackerList[1]=192.168.0.202:22122

4、在项目中使用 客户端主要包括以下接口: TrackerClient - TrackerServer接口 GenerateStorageClient - 一般文件存储接口 (StorageServer接口) FastFileStorageClient - 为方便项目开发集成的简单接口(StorageServer接口) AppendFileStorageClient - 支持文件续传操作的接口 (StorageServer接口)

笔者在前一个项目当中将fdfs主要用于图片存储,基于FastFileStorageClient接口和springmvc提供的MultipartFile接口封装了一个简单的工具类,方便全局管理与调用。如下所示:

package com.digi_zones.support.fs; import com.digi_zones.config.AppConfig; import com.digi_zones.contacts.AppConstants; import com.github.tobato.fastdfs.domain.FileInfo; import com.github.tobato.fastdfs.domain.StorePath; import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException; import com.github.tobato.fastdfs.service.FastFileStorageClient; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.Charset; /**  * <p>Description: FastDFS文件上传下载包装类</p>  * <p>Copyright: Copyright (c) 2016</p>  *  * @author 杨信  * @version 1.0  * @date 2016/9/7  */ @Component public class FastDFSClientWrapper {     private final Logger logger = LoggerFactory.getLogger(FastDFSClientWrapper.class);     @Autowired     private FastFileStorageClient storageClient;     @Autowired     private AppConfig appConfig;   // 项目参数配置     /**      * 上传文件      * @param file 文件对象      * @return 文件访问地址      * @throws IOException      */     public String uploadFile(MultipartFile file) throws IOException {         StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null);         return getResAccessUrl(storePath);     }     /**      * 将一段字符串生成一个文件上传      * @param content 文件内容      * @param fileExtension      * @return      */     public String uploadFile(String content, String fileExtension) {         byte[] buff = content.getBytes(Charset.forName("UTF-8"));         ByteArrayInputStream stream = new ByteArrayInputStream(buff);         StorePath storePath = storageClient.uploadFile(stream,buff.length, fileExtension,null);         return getResAccessUrl(storePath);     }     // 封装图片完整URL地址     private String getResAccessUrl(StorePath storePath) {         String fileUrl = AppConstants.HTTP_PRODOCOL + appConfig.getResHost()                 + ":" + appConfig.getFdfsStoragePort() + "/" + storePath.getFullPath();         return fileUrl;     }     /**      * 删除文件      * @param fileUrl 文件访问地址      * @return      */     public void deleteFile(String fileUrl) {         if (StringUtils.isEmpty(fileUrl)) {             return;         }         try {             StorePath storePath = StorePath.praseFromUrl(fileUrl);             storageClient.deleteFile(storePath.getGroup(), storePath.getPath());         } catch (FdfsUnsupportStorePathException e) {             logger.warn(e.getMessage());         }     } }

除了FastDFSClientWrapper类中用到的api,客户端提供的api还有很多,可根据自身的业务需求,将其它接口也添加到工具类中即可。如下所示:

// 上传文件,并添加文件元数据 StorePath uploadFile(InputStream inputStream, long fileSize, String fileExtName, Set<MateData> metaDataSet); // 获取文件元数据 Set<MateData> getMetadata(String groupName, String path); // 上传图片并同时生成一个缩略图 StorePath uploadImageAndCrtThumbImage(InputStream inputStream, long fileSize, String fileExtName,             Set<MateData> metaDataSet); // 。。。 在项目中使用FastDFSClientWrapper:

@Controller public class MyController {     @Autowired     private FastDFSClientWrapper dfsClient;     // 上传图片     @RequestMapping(value = "/upload", method = RequestMethod.POST)     public String upload(MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws Exception {         // 省略业务逻辑代码。。。         String imgUrl = dfsClient.uploadFile(file);         // 。。。。         return xxxx;     } }

 

最新回复(0)