使用 FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。
Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage server 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。
fdfs: so-timeout: 1500 connect-timeout: 600 #缩略图生成参数 thumb-image: width: 150 height: 150 #TrackerList参数,支持多个 tracker-list: 127.0.0.1:22122 web-server-url: http://127.0.0.1:8888/ spring: servlet: multipart: max-file-size: 50MB #设置单个文件大小 max-request-size: 500MB #设置单次请求文件的总大小
配置Bean
@Bean public MultipartConfigElement MultipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); // 单个数据大小 factory.setMaxFileSize(DataSize.parse("50MB"));// KB,MB // 总上传数据大小 factory.setMaxRequestSize(DataSize.parse("500MB")); return factory.createMultipartConfig(); }
视频封面传到图片服务器,视频文件传到视频服务器;讲两份文件的url保存到数据库
@Service public class SmallVideosService { @Reference private VideoApi videoApi; @Reference private UserInfoApi userInfoApi; @Autowired private OssTemplate ossTemplate; @Autowired private FastFileStorageClient storageClient; @Autowired private FdfsWebServer webServer; @Autowired private RedisTemplate<String,String> redisTemplate; /** * 发布视频 */ //@CacheEvict(value = "videoList",allEntries = true) public ResponseEntity saveVideos(MultipartFile videoThumbnail, MultipartFile videoFile) throws IOException { //1、封面图上传到阿里云OSS,获取地址 String picUrl = ossTemplate.upload(videoThumbnail.getOriginalFilename(), videoThumbnail.getInputStream()); //2、视频上传到fdfs上,获取请求地址 //获取文件的后缀名 String filename = videoFile.getOriginalFilename(); //ssss.avi String sufix = filename.substring(filename.lastIndexOf(".")+1); StorePath storePath = storageClient.uploadFile(videoFile.getInputStream(), videoFile.getSize(), sufix, null);//文件输入流,文件长度,文件后缀,元数据 String videoUrl = webServer.getWebServerUrl() + storePath.getFullPath(); //3、创建Video对象,并设置属性 Video video = new Video(); video.setUserId(UserHolder.getUserId()); video.setPicUrl(picUrl); video.setVideoUrl(videoUrl); video.setText("我就是我,不一样的烟火"); //4、调用API完成保存 videoApi.save(video); //5、构造返回值 return ResponseEntity.ok(null); } }