zoukankan      html  css  js  c++  java
  • FastDFS文件上传下载流程

    上传:

    1. Client通过Tracker server查找可用的Storage server。

    2. Tracker server向Client返回一台可用的Storage server的IP地址和端口号。

    3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。

    4. 上传完成,Storage server返回Client一个文件ID,文件上传结束。

    下载:

    1. Client通过Tracker server查找要下载文件所在的的Storage server。

    2. Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。

    3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。

    4. 下载文件成功。

    java客户端

    springboot项目引入依赖

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

    配置类

    package com.leyou.config;
     
    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 {
    }
    

    在yml中编写FastDFS的属性

    测试:

    package com.leyou.test;
     
    import com.github.tobato.fastdfs.domain.StorePath;
    import com.github.tobato.fastdfs.domain.ThumbImageConfig;
    import com.github.tobato.fastdfs.service.FastFileStorageClient;
    import com.leyou.LyUploadService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
     
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = LyUploadService.class)
    public class FdfsTest {
     
        @Autowired
        private FastFileStorageClient storageClient;
     
        @Autowired
        private ThumbImageConfig thumbImageConfig;
     
        @Test
        public void testUpload() throws FileNotFoundException {
            File file = new File("G:\LeYou\upload\spitter_logo_50.png");
            // 上传
            StorePath storePath = this.storageClient.uploadFile(
                    new FileInputStream(file), file.length(), "png", null);
            // 带分组的路径
            System.out.println(storePath.getFullPath());
            // 不带分组的路径
            System.out.println(storePath.getPath());
        }
     
        @Test
        public void testUploadAndCreateThumb() throws FileNotFoundException {
            File file = new File("G:\LeYou\upload\spitter_logo_50.png");
            // 上传并且生成缩略图
            StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
                    new FileInputStream(file), file.length(), "png", null);
            // 带分组的路径
            System.out.println(storePath.getFullPath());
            // 不带分组的路径
            System.out.println(storePath.getPath());
            // 获取缩略图路径
            String path = thumbImageConfig.getThumbImagePath(storePath.getPath());
            System.out.println(path);
        }
    }
    

    具体应用中上传

    package com.leyou.upload.service.serviceimpl;
    
    import com.github.tobato.fastdfs.domain.StorePath;
    import com.github.tobato.fastdfs.service.FastFileStorageClient;
    import com.leyou.upload.service.UploadService;
    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.Service;
    import org.springframework.web.multipart.MultipartFile;
     
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Objects;
     
    @Service
    public class UploadServiceImpl implements UploadService {
     
        @Autowired
        private FastFileStorageClient storageClient;
     
        private static final Logger logger= LoggerFactory.getLogger(UploadServiceImpl.class);
     
        /**
         *     支持上传的文件类型
         */
        private static final List<String> suffixes = Arrays.asList("image/png","image/jpeg","image/jpg");
     
     
        @Override
        public String upload(MultipartFile file) {
            /**
             * 1.图片信息校验
             *      1)校验文件类型
             *      2)校验图片内容
             * 2.保存图片
             *      1)生成保存目录
             *      2)保存图片
             *      3)拼接图片地址
             */
            try {
                String type = file.getContentType();
                if (!suffixes.contains(type)) {
                    logger.info("上传文件失败,文件类型不匹配:{}", type);
                    return null;
                }
                BufferedImage image = ImageIO.read(file.getInputStream());
                if (image == null) {
                    logger.info("上传失败,文件内容不符合要求");
                    return null;
                }
     
                StorePath storePath = this.storageClient.uploadFile(
                      file.getInputStream(), file.getSize(), getExtension(file.getOriginalFilename()), null);
           
                String url = "http://image.leyou.com/"+storePath.getFullPath();
                return url;
            }catch (Exception e){
                return null;
            }
        }
     
        public String getExtension(String fileName){
            return StringUtils.substringAfterLast(fileName,".");
        }
    }
    
  • 相关阅读:
    tomcat虚拟机配置
    日期时分秒毫秒+3位随机数
    springmvc action访问路径不带项目名
    nginx 配置模板
    AES加密
    spring-mvc里的 <mvc:resources> 及静态资源访问
    MySQL——事务(Transaction)
    mysql索引
    < aop:aspect>与< aop:advisor>的区别
    annotation-driven
  • 原文地址:https://www.cnblogs.com/treasury/p/12872754.html
Copyright © 2011-2022 走看看