赞
踩
拉取镜像
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
sh tracker.sh
运行tracker.sh脚本文件配置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信息获取图片信息。
至此就搭建好啦!
查看client.conf ,检查tracker_server地址
vi /etc/fdfs/client.conf
如果是云服务器,需要检查一下开放的端口号;
vi /etc/fdfs/storage.conf
vi /etc/fdfs/tracker.conf
此时需要防火墙开放这两个端口
搭好了那我们就写个小程序玩一玩吧
先上工具类:
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测试一下
拿到地址访问成功!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。