Docker安装FastDfs和上传图片入门小程序
1.搭建FastDfs
拉取镜像
docker pull morunchang/fastdfs
运行tracker
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh
–net=host 和虚拟机使用同一套网络
运行storage
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
docker exec -it storage /bin/bash
进入后
vi /etc/nginx/conf/nginx.conf
添加以下内容:
上图配置如下:
location ~ /M00 {
ngx_fastdfs_module;
}
访问图片的时候,浏览器通常都会对图片进行缓存,如果有禁止缓存,可以设置nginx配置添加禁止缓存即可。
禁止缓存:
add_header Cache-Control no-store;
退出容器:
exit
重启storage容器:
docker restart storage
查看启动容器docker ps
开启启动设置:
docker update --restart=always tracker
docker update --restart=always storage
安装Nginx目的:
nginx集成了FastDFS,可以通过它的ngx_fastdfs_module模块,可以通过该模块访问Tracker获取图片所存储的Storage信息,然后访问Storage信息获取图片信息。
至此就搭建好啦!
2.可能遇到的问题
查看client.conf ,检查tracker_server地址
vi /etc/fdfs/client.conf
如果是云服务器,需要检查一下开放的端口号;
- tracker server的端口号 默认22122 在tracker.conf中
- storage server的端口号 默认23000 在storage.conf中
vi /etc/fdfs/storage.conf
vi /etc/fdfs/tracker.conf
此时需要防火墙开放这两个端口
3.小程序
搭好了那我们就写个小程序玩一玩吧
先上工具类:
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文件
配置如下:
tracker_server=你的服务器IP:22122
# 连接超时时间,针对socket套接字函数connect,默认为30秒
connect_timeout=30000
# 网络通讯超时时间,默认是60秒
network_timeout=60000
Controller代码:
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测试一下
拿到地址访问成功!