spring boot 整合 FastDFS_Client

FastDFS-Client使用方式
1.在项目Pom当中加入依赖

Maven依赖为

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

2.将Fdfs配置引入项目

将FastDFS-Client客户端引入本地化项目的方式非常简单,在SpringBoot项目/src/[com.xxx.主目录]/conf当中配置

    /**
     * 导入FastDFS-Client组件
     *
     * @author tobato
     *
     */
    @Configuration
    @Import(FdfsClientConfig.class)
    // 解决jmx重复注册bean的问题
    @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
    public class ComponetImport {
        // 导入依赖组件
    }

对的,只需要一行注解 @Import(FdfsClientConfig.class)就可以拥有带有连接池的FastDFS Java客户端了。

如果不加 spring.jmx.enabled=false 和 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) 启动项目时会报异常:

    org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [FdfsConnectionPool [maxTotal=50, blockWhenExhausted=true, maxWaitMillis=100, lifo=true, fairness=false, testOnCreate=false, testOnBorrow=false, testOnReturn=false, testWhileIdle=true, timeBetweenEvictionRunsMillis=60000, numTestsPerEvictionRun=-1, minEvictableIdleTimeMillis=180000, softMinEvictableIdleTimeMillis=-1, evictionPolicy=org.apache.commons.pool2.impl.DefaultEvictionPolicy@1a05ff8e, closeLock=java.lang.Object@251e2f4a, closed=false, evictionLock=java.lang.Object@1abea1ed, evictor=org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@6f5288c5, evictionIterator=null, factoryClassLoader=java.lang.ref.WeakReference@5a9ef32e, oname=org.apache.commons.pool2:type=GenericKeyedObjectPool,name=pool, creationStackTrace=java.lang.Exception
        at org.apache.commons.pool2.impl.BaseGenericObjectPool.<init>(BaseGenericObjectPool.java:142)
        at org.apache.commons.pool2.impl.GenericKeyedObjectPool.<init>(GenericKeyedObjectPool.java:105)
        at com.github.tobato.fastdfs.conn.FdfsConnectionPool.<init>(FdfsConnectionPool.java:33)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)

推荐使用 : @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)

    注意:@EnableMBeanExport解决问题JMX重复注册问题,不要再配置 spring.jmx.enabled=false,以免影响SpringBoot默认的JMX监控。

3.在application.yml当中配置Fdfs相关参数

    # ===================================================================
    # 分布式文件系统FDFS配置
    # ===================================================================
    fdfs:
      so-timeout: 1501
      connect-timeout: 601
      thumb-image:             #缩略图生成参数
        width: 150
        height: 150
      tracker-list:            #TrackerList参数,支持多个
        - 192.168.1.105:22122
        - 192.168.1.106:22122

如果有必要可以参考 apache.pool2 参数配置连接池属性

    fdfs:
       ..其他配置信息..
      pool:
        #从池中借出的对象的最大数目
        max-total: 153
        #获取连接时的最大等待毫秒数100
         max-wait-millis: 102

4.使用接口服务对Fdfs服务端进行操作

主要接口包括

    TrackerClient - TrackerServer接口
    GenerateStorageClient - 一般文件存储接口 (StorageServer接口)
    FastFileStorageClient - 为方便项目开发集成的简单接口(StorageServer接口)
    AppendFileStorageClient - 支持文件续传操作的接口 (StorageServer接口)

 
5.网友整理的工具类:

基于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;
     
        }
    }

 
设置上传文件大小

默认1M

第一种、直接在springboot的启动类里加入下面的代码。

在启动类中配置@Bean,注意当前类上需要加注解@Configuration

    /**  
         * 文件上传配置  
         * @return  
         */  
        @Bean  
        public MultipartConfigElement multipartConfigElement() {  
            MultipartConfigFactory factory = new MultipartConfigFactory();  
            //文件最大  
            factory.setMaxFileSize("10240KB"); //KB,MB  
            /// 设置总上传数据总大小  
            factory.setMaxRequestSize("102400KB");  
            return factory.createMultipartConfig();  
        }  

第二种、在application.properties中添加如下配置信息

    spring.http.multipart.maxFileSize=10Mb
    spring.http.multipart.maxRequestSize=10Mb

maxFileSize 是单个文件大小
maxRequestSize是设置总上传的数据大小
这就可以了。

 

常见错误:

java.lang.IllegalStateException: Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest]: org.apache.catalina.connector.RequestFacade@1fa4d44b
看我这篇文章:https://blog.csdn.net/ityqing/article/details/83090034

 

本文demo:

https://gitee.com/publicman/codes/374faxidk1yqmonvr5cb976

https://gitee.com/publicman/codes/wey8l9vqfk6htups3mz1o59

 

 

源码下载:https://github.com/tobato/FastDFS_Client
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值