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

image-20220319162748847

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;

image-20220319155131530

退出容器:

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

image-20220319155921796

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

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

image-20220319160301088

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

image-20220319160456004

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文件

image-20220319161108385

配置如下:

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测试一下

image-20220319161627945

拿到地址访问成功!

image-20220319161953101

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐