Docker 搭建FDFS,以及结合Springboot使用

下载docker镜像

docker pull  season/fastdfs:1.2

创建三个文件夹

mkdir /usr/local/server/fastdfs/tracker/data

mkdir /usr/local/server/fastdfs/storage/data

mkdir /usr/local/server/fastdfs/storage/path

创建tracker容器

docker run -itd --name tracker \
-p 22122:22122 \
--restart=unless-stopped --net host \
-v /usr/local/server/fastdfs/tracker/data:/fastdfs/tracker/data \
season/fastdfs:1.2 tracker

创建storage 需要修改成你的tracker的 ip

docker run -id --name storage \
--restart=unless-stopped --net host \
-v /usr/local/server/fastdfs/storage/data:/fastdfs/store_path \
-e TRACKER_SERVER="IP:22122" \
season/fastdfs:1.2 storage

修改 tracker 的配置文件

cd /etc/fdfs/
vim client.config

tracker_server=你的IP:22122

创建nginx 容器 需要修改成你的tracker的 ip

docker run -id --name fastdfs_nginx \
--restart=unless-stopped \
-v /usr/local/server/fastdfs/storage/data/:/fastdfs/store_path \
-v /usr/local/server/fastdfs/nginx/nginx.conf:/etc/nginx/conf/nginx.conf \
-p 8888:80 \
-e TRACKER_SERVER=IP:22122 \
season/fastdfs:1.2 nginx

nginx 配置修改

docker exec -it nginx bash 
cd /etc/nginx/conf/
vim nginx.conf

修改成
location / {
  root   fastdfs/store_path/data;
  ngx_fastdfs_module;
}

进入tracker 容器测试

docker exec -it  tracker bash
echo "hello world!">> a.txt
fdfs_upload_file /etc/fdfs/client.conf a.txt

返回 group1/M00/00/00/wKi6a2NobPKAU7qSAAAADFmwwCQ619.txt

浏览器访问

127.0.0.1:8888/group1/M00/00/00/wKi6a2NobPKAU7qSAAAADFmwwCQ619.txt

Springboot 使用,引入gav坐标

        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
            <version>1.27.2</version>
        </dependency>

修改application.properties配置文件

################### fastdfs config##########
fdfs.so-timeout=1501
fdfs.connect-timeout=601
fdfs.thumb-image.height=150
fdfs.thumb-image.width=150
fdfs.tracker-list=Tracker IP:22122
fdfs.web-server-url=http://Nginx IP:8888/

新建一个导入类

@Configuration
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastDFSImport {
}

创建工具类

@Component
public class FdfsClientUtils {
    @Autowired
    private FastFileStorageClient storageClient;
    @Autowired
    private FdfsWebServer fdfsWebServer;

    public String uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
        return fdfsWebServer.getWebServerUrl() + storePath.getFullPath();
    }

    /**
     *      * 上传文件
     *      * @param file 文件对象
     *      * @return 文件访问地址
     *      * @throws IOException
     *      
     */
    public String uploadFile(File file) throws IOException {
        FileInputStream inputStream = new FileInputStream(file);
        StorePath storePath = storageClient.uploadFile(inputStream, file.length(), FilenameUtils.getExtension(file.getName()), null);
        return getResAccessUrl(storePath);
    }

    private String getResAccessUrl(StorePath storePath) {
        return fdfsWebServer.getWebServerUrl() + storePath.getFullPath();
    }

    /**
     * 删除文件
     *
     * @param filePath 文件路径
     */
    public void deleteFile(String filePath) {
        if (StringUtils.isEmpty(filePath)) {
            return;
        }
        try {
            StorePath storePath = StorePath.parseFromUrl(filePath);
            storageClient.deleteFile(storePath.getPath(), storePath.getPath());
        } catch (Exception e) {
            //to do
        }
    }

    public byte[] downloadFile(String filePath) {
       //方式一
        StorePath storePath = StorePath.parseFromUrl(filePath);
      //方式二
        String group = filePath.substring(0, filePath.indexOf("/"));
        String path = filePath.substring(filePath.indexOf("/") + 1);
        DownloadByteArray downloadByteArray = new DownloadByteArray();
        return storageClient.downloadFile(group, path, downloadByteArray);
    }
}
posted @   lyu6  阅读(324)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示