fastdfs简单使用

首先安装fastdfs 这里使用docker 简单快捷

1. docker pull delron/fastdfs 下载最新镜像
2.docker run -d --network=host --name tracker -v 宿主机目录:/var/fdfs delron/fastdfs tracker 启动tracker服务
3.docker run -dti --network=host --name storage -e TRACKER_SERVER=宿主机ip地址:22122 -v 宿主机目录:/var/fdfs delron/fastdfs storage 安装storage服务
4. 8888是默认的nginx代理端口,23000是storage服务端口,22122是tracker服务端口。需要开放这几个端口 由于nginx端口是8888 所以文件上传的访问路径端口也是8888

接下来就是与spring boot整合

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

maven依赖 然后就是配置文件

#fastdfs配置
fdfs:
  #tracker 服务器列表
  tracker-list:
    - 宿主机ip:22122
  #超时时间
  connect-timeout: 600
  #略缩图
  thumb-image:
    height: 150
    width: 150
spring:
  servlet:
    multipart:
      max-file-size: 10MB #单个文件最大大小
      max-request-size: 100MB #一次请求最大文件大小

启动类上加一个注解 导入FdfsClientConfig的配置

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

到这里 配置基本完成了  这个依赖是GitHub上的一个开源项目,详细一些可以去GitHub上搜索

贴一下service和controller

/**
 * @Description: 文件上传下载
 * @Author: Tan
 * @CreateDate: 2020/3/31
 **/
@Service
public class FileService {

    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private ThumbImageConfig thumbImageConfig;


   /**
    * @Description: 文件上传  返回上传完成以后的文件路径
    * @Author: Tan
    * @Date: 2020/3/31
    * @param file: 上传文件对象
    * @return: java.lang.String
    **/
    public String uploadFile(MultipartFile file) throws IOException {
        //参1 文件输入流,参2 文件大小,参3 文件拓展名,参4 元数据集合
        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(),
                FilenameUtils.getExtension(file.getOriginalFilename()), null);
        return storePath.getFullPath();
    }

    /**
     * @Description: 上传图片并且创建缩略图
     * @Author: Tan
     * @Date: 2020/3/31
     * @param file: 图片文件对象
     * @return: java.lang.String
     **/
    public  String uploadImageAndCreateThumbImage(MultipartFile file) throws IOException{
        StorePath storePath = storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(),
                FilenameUtils.getExtension(file.getOriginalFilename()), null);
        return storePath.getFullPath();
    }


    /**
     * @Description: 根据文件名获取缩略图路径
     * @Author: Tan
     * @Date: 2020/3/31
     * @param filePath: 缩略图路径
     * @return: java.lang.String
     **/
    public String getThumbImagePath(String filePath) {
        return thumbImageConfig.getThumbImagePath(filePath);
    }


    /**
     * @Description:  根据文件路径进行下载 返回一个byte[]数组 包含文件内容
     * @Author: Tan
     * @Date: 2020/3/31
     * @param filePath: 下载文件路径
     * @return: byte[]
     **/
    public byte[] downFile(String filePath) throws IOException {
        StorePath storePath = StorePath.parseFromUrl(filePath);
        return storageClient.downloadFile(storePath.getGroup(), storePath.getPath(), new DownloadCallback<byte[]>() {
            @Override
            public byte[] recv(InputStream ins) throws IOException {
                return org.apache.commons.io.IOUtils.toByteArray(ins);
            }
        });
    }



    /**
     * @Description: 根据文件路径 删除文件
     * @Author: Tan
     * @Date: 2020/3/31
     * @param filePath: 文件路径
     * @return: void
     **/
    public void deleteFile(String filePath) {
        StorePath storePath = StorePath.parseFromUrl(filePath);
        storageClient.deleteFile(storePath.getGroup(), storePath.getPath());

    }



}
@Controller
public class FileUploadAndDownloadController  {

    @Autowired
    private FileService fileService;

    @ResponseBody
    @PostMapping("/fileUpload")
    public String fileUpload(MultipartFile multipartFile) throws IOException {
        return  "上传成功 文件地址为:"+ fileService.uploadFile(multipartFile);
    }

    @RequestMapping("/downloadFile")
    public void downloadFile(String filePath, HttpServletResponse response) throws IOException {
        response.setContentType("application/octet-stream");
        response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("中文名.jpg","utf-8"));
        byte[] bytes = fileService.downFile(filePath);
        response.getOutputStream().write(bytes);
    }

基本使用就是这些

 

posted @ 2020-03-31 18:22  沙漠里的橘子皮  阅读(581)  评论(0编辑  收藏  举报