FastDFS 介绍
1). 为什么图片不存在服务器本地 , 而要存储在FastDFS这个分布式文件系统中 ?
2). FastDFS架构
FastDFS 是一个分布式文件系统 (阿里巴巴) ;
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存 储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的 问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
两个角色:
Tracker : 集群管理 , 中央调度 ;
Storage : 存储
1.2 FastDFS上传流程
1.3 FastDFS 安装
1). 如果使用的是提供的虚拟机 , FastDFS 镜像/容器都已经部署好了, 我们不需要执行任何操作 ;
2). 如果不是使用的提供的虚拟机 , 就需要根据笔记中提供的创建容器的步骤, 一步步的操作 ;
1.4 文件系统微服务搭建
1). pom.xml
org.springframework.boot
spring-boot-starter-web
2). application.yml
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
server:
port: 9008
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
3). fdfs_client.conf
connect_timeout = 60
network_timeout = 60
charset = UTF-8
http.tracker_http_port = 8080
tracker_server = 192.168.200.128:22122
4). 引导类
@SpringBootApplication
@EnableEurekaClient
public class FileApplication {
public static void main(String[] args) {
SpringApplication.run(FileApplication.class,args);
}
}
1.5 FastDFS客户端API操作
1). 上传文件
@Test
public void testUploadFile() throws Exception {
//1. 加载fastDFS配置文件
ClientGlobal.init("D:\\changgou_parent\\changgou_service_file\\src\\main\\resources\\fdfs_client.conf");
//2. 创建TrackerClient
TrackerClient trackerClient = new TrackerClient();
//3. 获取TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();
//4. 创建StorageServer
StorageServer storageServer = null;
//5. 构建StorageClient
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//6. 文件上传
String[] strings = storageClient.upload_file("D:/1.jpg", "jpg", null);
for (String string : strings) {
System.out.println(string);
}
}
测试
http://192.168.192.152:8080/group1/M00/00/00/wKjAmF5DYriATi_fAAIz-JD1R5o225.jpg
2). 下载文件
byte[] bytes = storageClient.download_file("group1", "M00/00/00/wKjAmF5DYriATi_fAAIz-JD1R5o225.jpg");
FileOutputStream out = new FileOutputStream(new File("D:/001.jpg"));
out.write(bytes);
out.close();
3). 删除文件
int deleteFile = storageClient.delete_file("group1", "M00/00/00/wKjAmF5DYriATi_fAAIz-JD1R5o225.jpg");
System.out.println(deleteFile);
1.6 文件上传接口开发
用到的知识 :
1). SpringMVC中的文件上传 ;
SpringMVC 如何接收上传的文件 -------------> MultipartFile
2). FastDFS 中的API ;
代码实现 :
@RestController
@RequestMapping("/file")
public class FileController {
/**
* 文件上传
* 文件上传必须为post请求
* @param file file必须和页面请求的名称一致
* @return 返回文件上传的结果
*/
@PostMapping("/upload")
public Result uploadFile(MultipartFile file){
// 1.代码用try catch包裹,防止给用户响应错误的提示
try {
// 2.1进行非空校验,如果文件为null。则返回错误提示
if (file == null){
throw new RuntimeException("文件不存在");
}
// 2.2进行非空校验,如果上传的文件名称为空,则文件不存在 ,获取文件的完整的名称
String originalFilename = file.getOriginalFilename();
// 2.3判断如果文件名是不是空的 如果是空的返回文件不存在
if (StringUtils.isEmpty(originalFilename)){
throw new RuntimeException("文件不存在");
}
// 3.如果文件存在,构建fastDFSFile对象
// 获取文件名称String name, 文件内容byte[] content, 文件的后缀名String ext
// 3.1获取文件内容
byte[] content = file.getBytes();
// 3.2已经获取了文件的全名称。进行截取获取文件的后缀名
String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
// 4.构建fastDFSFile对象
FastDFSFile fastDFSFile = new FastDFSFile(originalFilename,content,ext);
// 5.调用工具类进行上传
String[] strings = FastDFSClient.upload(fastDFSFile);
// 6.封装返回的结果 拼接url
String url = FastDFSClient.getTrackerUrl() + strings[0] + "/" + strings[1];
return new Result(true,StatusCode.OK,"文件上传成功",url);
} catch (Exception e) {
e.printStackTrace();
}
return new Result(false, StatusCode.ERROR,"文件上传失败");
}
}