小视频储存方案——FastDFS
FastDFS是分布式文件系统
使用 FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage server 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。
fdfs:
so-timeout: 1500
connect-timeout: 600
#缩略图生成参数
thumb-image:
width: 150
height: 150
#TrackerList参数,支持多个
tracker-list: ip:22122
web-server-url: http://ip: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);
}
}

浙公网安备 33010602011771号