Docker安装FastDfs和上传图片入门小程序
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;
|
退出容器:
重启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
|
如果是云服务器,需要检查一下开放的端口号;
- tracker server的端口号 默认22122 在tracker.conf中
- storage server的端口号 默认23000 在storage.conf中
1 2
| vi /etc/fdfs/storage.conf vi /etc/fdfs/tracker.conf
|
此时需要防火墙开放这两个端口
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;
public class FastDfsUtil { static { try { ClassPathResource resource = new ClassPathResource("tracker.conf"); ClientGlobal.init(resource.getPath()); } catch (Exception e) { e.printStackTrace(); } }
public static String fileUpload(MultipartFile multipartFile) throws Exception { TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); StorageClient storageClient = new StorageClient(trackerServer, null);
String[] strings = storageClient.upload_file( multipartFile.getBytes(), StringUtils.getFilenameExtension(multipartFile.getOriginalFilename()), null); return strings[0] + "/" + strings[1];
}
public static byte[] downLoad(String groupName, String fileName) throws Exception { TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); StorageClient storageClient = new StorageClient(trackerServer, null); byte[] bytes = storageClient.download_file(groupName, fileName); return bytes; }
public static Boolean deleteFile(String groupName, String fileName) throws Exception { TrackerClient trackerClient = new TrackerClient(); TrackerServer trackerServer = trackerClient.getConnection(); StorageClient storageClient = new StorageClient(trackerServer, null); int i = storageClient.delete_file(groupName, fileName); return i >= 0 ? true : false; }
}
|
在resources下创建tracker.conf文件
配置如下:
1 2 3 4 5
| tracker_server=你的服务器IP:22122
connect_timeout=30000
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;
@RestController @RequestMapping("/admin/product") public class FileController {
@Value("${fileServer.url}") private String imageUrl;
@PostMapping("/fileUpload") public Result fileUpload(@RequestParam("file") MultipartFile multipartFile) throws Exception { String fileName = FastDfsUtil.fileUpload(multipartFile); return Result.ok(imageUrl + fileName); } }
|
跑起来后我们用postman测试一下
拿到地址访问成功!