当前位置:   article > 正文

Docker安装FastDfs和上传图片入门小程序_docker安装的fastdfs镜像上传查看不到图片

docker安装的fastdfs镜像上传查看不到图片

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

image-20220319162748847

1.搭建FastDfs

拉取镜像

docker pull morunchang/fastdfs
  • 1

运行tracker

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

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

运行storage

docker run -d --name storage --net=host -e TRACKER_IP=服务器IP:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
  • 1
  • 使用的网络模式是–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
  • 1

进入后

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

添加以下内容:

上图配置如下:

location ~ /M00 {
     ngx_fastdfs_module;
}
  • 1
  • 2
  • 3

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

禁止缓存:

add_header Cache-Control no-store;
  • 1

image-20220319155131530

退出容器:

exit
  • 1

重启storage容器:

docker restart storage
  • 1

查看启动容器docker ps

开启启动设置:

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

安装Nginx目的:

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

至此就搭建好啦!

2.可能遇到的问题

查看client.conf ,检查tracker_server地址

vi  /etc/fdfs/client.conf
  • 1

image-20220319155921796

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

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

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;
    }

}

  • 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

在resources下创建tracker.conf文件

image-20220319161108385

配置如下:

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

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);
    }
}

  • 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

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

image-20220319161627945

拿到地址访问成功!

image-20220319161953101

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/986600
推荐阅读
相关标签
  

闽ICP备14008679号