Docker安装FastDfs和上传图片入门小程序

本文最后更新于:4 天前

Docker安装FastDfs和上传图片入门小程序

image-20220319162748847

1.搭建FastDfs

拉取镜像

1
docker pull morunchang/fastdfs

运行tracker

1
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh

–net=host 和虚拟机使用同一套网络

运行storage

1
docker run -d --name storage --net=host -e TRACKER_IP=服务器IP:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
  • 使用的网络模式是–net=host, 此时会将宿主机的网络应用于容器,链接容器就可以直接使用宿主机的IP
  • sh tracker.sh运行tracker.sh脚本文件
  • group1是组名,即storage的组
  • 如果想要增加新的storage服务器,再次运行该命令,注意更换 新组名

配置Nginx

Nginx在这里主要提供对FastDFS图片访问的支持,Docker容器中已经集成了Nginx,我们需要修改nginx的配置,进入storage的容器内部,修改nginx.conf

1
docker exec -it storage  /bin/bash

进入后

1
vi /etc/nginx/conf/nginx.conf

添加以下内容:

上图配置如下:

1
2
3
location ~ /M00 {
ngx_fastdfs_module;
}

访问图片的时候,浏览器通常都会对图片进行缓存,如果有禁止缓存,可以设置nginx配置添加禁止缓存即可。

禁止缓存:

1
add_header Cache-Control no-store;

image-20220319155131530

退出容器:

1
exit

重启storage容器:

1
docker restart storage

查看启动容器docker ps

开启启动设置:

1
2
docker update --restart=always tracker
docker update --restart=always storage

安装Nginx目的:

nginx集成了FastDFS,可以通过它的ngx_fastdfs_module模块,可以通过该模块访问Tracker获取图片所存储的Storage信息,然后访问Storage信息获取图片信息。

至此就搭建好啦!

2.可能遇到的问题

查看client.conf ,检查tracker_server地址

1
vi  /etc/fdfs/client.conf

image-20220319155921796

如果是云服务器,需要检查一下开放的端口号;

  • tracker server的端口号 默认22122 在tracker.conf中
  • storage server的端口号 默认23000 在storage.conf中
1
2
vi /etc/fdfs/storage.conf
vi /etc/fdfs/tracker.conf

image-20220319160301088

此时需要防火墙开放这两个端口

image-20220319160456004

3.小程序

搭好了那我们就写个小程序玩一玩吧

先上工具类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

/**
* @program: gmall
* @author: 龙龙
* @create: 2022-03-19 14:04
* @description:
**/
public class FastDfsUtil {
//静态代码块 只需要加载一次
static {
try {
//加载classpath下的配置文件
ClassPathResource resource = new ClassPathResource("tracker.conf");
//初始化加载tracker的信息
ClientGlobal.init(resource.getPath());
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 文件上传
* @param multipartFile
* @return
* @throws Exception
*/
public static String fileUpload(MultipartFile multipartFile) throws Exception {
//初始化TrackClient
TrackerClient trackerClient = new TrackerClient();
//获取连接
TrackerServer trackerServer = trackerClient.getConnection();
//通过tracker获取storage的信息
StorageClient storageClient = new StorageClient(trackerServer, null);
//通过storage完成文件的上传
/**
* 1.文件的字节码
* 2.文件的拓展名
* 3.附加参数: 比如 时间 地点 水印 人等
*/
String[] strings = storageClient.upload_file(
multipartFile.getBytes(), //字节码
StringUtils.getFilenameExtension(multipartFile.getOriginalFilename()), //扩展名
null);//元数据列表
// strings[0]: group1
// strings[1]: M00/00/00/CgAIA2I1kveAEYRLAABygkS2Cqw568.jpg
return strings[0] + "/" + strings[1];

}

/**
* 文件的下载
* @param groupName
* @param fileName
* @return
* @throws Exception
*/
public static byte[] downLoad(String groupName, String fileName) throws Exception {
//初始化trackerClient
TrackerClient trackerClient = new TrackerClient();
//获取连接
TrackerServer trackerServer = trackerClient.getConnection();
//通过tracker获取storage的信息
StorageClient storageClient = new StorageClient(trackerServer, null);
//通过storage完成文件的下载
byte[] bytes = storageClient.download_file(groupName, fileName);
//返回结果
return bytes;
}

/**
* 文件的删除
*/
public static Boolean deleteFile(String groupName, String fileName) throws Exception {
//初始化trackerClient
TrackerClient trackerClient = new TrackerClient();
//获取连接
TrackerServer trackerServer = trackerClient.getConnection();
//通过tracker获取storage的信息
StorageClient storageClient = new StorageClient(trackerServer, null);
//通过storage完成文件的文件的删除
int i = storageClient.delete_file(groupName, fileName);
//返回结果
return i >= 0 ? true : false;
}

}

在resources下创建tracker.conf文件

image-20220319161108385

配置如下:

1
2
3
4
5
tracker_server=你的服务器IP:22122
# 连接超时时间,针对socket套接字函数connect,默认为30秒
connect_timeout=30000
# 网络通讯超时时间,默认是60秒
network_timeout=60000

Controller代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package slx.blue.gmall.product.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import slx.blue.gmall.common.result.Result;
import slx.blue.gmall.product.util.FastDfsUtil;

/**
* @program: gmall
* @author: 龙龙
* @create: 2022-03-19 12:52
* @description: 文件上传控制器
**/
@RestController
@RequestMapping("/admin/product")
public class FileController {

@Value("${fileServer.url}")
private String imageUrl; //http://你的IP地址:8080/ 这里放在yml文件中
/**
fileServer:
url: http://你的IP地址:8080/ # fastDFS 分布式文件系统的 ip:port
*/

@PostMapping("/fileUpload")
public Result fileUpload(@RequestParam("file") MultipartFile multipartFile) throws Exception {
String fileName = FastDfsUtil.fileUpload(multipartFile);
//返回可直接访问的图片地址 url + fileName
return Result.ok(imageUrl + fileName);
}
}

跑起来后我们用postman测试一下

image-20220319161627945

拿到地址访问成功!

image-20220319161953101


本博客目前大部分文章都是参考尚硅谷或者马士兵教育的学习资料!