1. 程式人生 > >Docker搭建分散式檔案系統fastDFS及SpringBoot整合fastDFS

Docker搭建分散式檔案系統fastDFS及SpringBoot整合fastDFS

docker安裝fastdfs映象

 docker pull morunchang/fastdfs

執行tracker

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

執行storage,注意把xxx.xxx.xxx.xxx換成自己的EOS伺服器IP

docker run -d --name storage --net=host -e TRACKER_IP=xxx.xxx.xxx.xxx:22122 -e GROUP_NAME= morunchang/fastdfs sh storage.sh

進入storage容器內部

docker exec -it storage  /bin/bash

修改nginx配置檔案

vi /data/nginx/conf/nginx.conf

新增如下內容

location /group1/M00 {
     proxy_next_upstream http_502 http_504 error timeout invalid_header;
     proxy_cache http-cache;
     proxy_cache_valid  200 304 12h;
     proxy_cache_key $uri$is_args$args;
     proxy_pass
http://fdfs_group1; expires 30d; }

退出

exit

重啟storage

docker restart storage

開啟埠號22122,80,23000,注意開啟23000

firewall-cmd --zone=public --add-port=22122/tcp --permanent 
firewall-cmd --zone=public --add-port=80/tcp --permanent 
firewall-cmd --zone=public --add-port=23000/tcp --permanent 

在pom.xml中引入依賴fastDFS的java客戶端依賴,使用開源中國的

        <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>

在類路徑下新增配置檔案fdfs_client.conf


connect_timeout=30

network_timeout=60

base_path=/home/fastdfs

#xxx.xxx.xxx.xxx改為自己EOS伺服器的ip
tracker_server=xxx.xxx.xxx.xxx:22122

log_level=info

use_connection_pool = false

connection_pool_max_idle_time = 3600

load_fdfs_parameters_from_tracker=false

use_storage_id = false

storage_ids_filename = storage_ids.conf

http.tracker_server_port=80

寫一個demo測試使用

package com.lhc.fastdfs.test;


import org.csource.fastdfs.*;
import org.springframework.core.io.ClassPathResource;

public class TestFastDFS {

    public static void main(String[] args) throws Exception {
        String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
        // 1、載入配置檔案,配置檔案中的內容就是 tracker 服務的地址。
        ClientGlobal.init(filePath);
        // 2、建立一個 TrackerClient 物件。直接 new 一個。
        TrackerClient trackerClient = new TrackerClient();
        // 3、使用 TrackerClient 物件建立連線,獲得一個 TrackerServer 物件。
        TrackerServer trackerServer = trackerClient.getConnection();
        // 4、建立一個 StorageServer 的引用,值為 null
        StorageServer storageServer = null;
        // 5、建立一個 StorageClient 物件,需要兩個引數 TrackerServer 物件、StorageServer 的引用
        StorageClient storageClient = new StorageClient(trackerServer, storageServer);
        // 6、使用 StorageClient 物件上傳圖片。
        //副檔名不帶“.”
        String[] strings = storageClient.upload_file("C:\Users\Administrator\Desktop\timg.jpg", "jpg",
            null);

        // 7、返回陣列。包含組名和圖片的路徑。
        for (String string : strings) {
            System.out.println(string);
        }
    }
}

使用angular.js上傳檔案
html的內容如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>

<script type="text/javascript" src="webjars/angularjs/1.7.2/angular.min.js"></script>

<body>
<div ng-app="myApp" ng-controller="myCon">


        <input type="file" name="uploadFile" id="uploadFile">

        <input type="button" value="upload" ng-click="uploadFile()">

        <img src="{{image.url}}" width="200px" height="200px">

</div>

</body>

    <script type="text/javascript" src="userController.js"></script>
</html>

controller的js如下


var app=angular.module("myApp",[]);

app.controller("myCon",function ($scope,$http) {
    $scope.uploadFile=function(){
        var formData=new FormData();
        var file =document.querySelector("#uploadFile").files[0];
        formData.append("file",file);
        $http({
            method:'POST',
            url:'/uploadFile',
            data: formData,
            headers: {'Content-Type':undefined},
            transformRequest: angular.identity
        }).then(function successCallback(response) {
            $scope.image={};
            $scope.image.url = response.data.message;
        }, function errorCallback(response) {
            // 請求失敗執行程式碼
            alert("上傳失敗")
        });
    }
})

springboot後臺程式碼如下,其中FastDFSClient,為對fastDFS的客戶端的操作程式碼的封裝,大家可以自己封裝一下

@RestController
public class UserController {

    @Value("${FILE_URL}")
    private String FILE_URL;

    @RequestMapping("/uploadFile")
    public R upload(@RequestParam(value = "file",required = true) MultipartFile file)throws Exception{

        String originalFilename = file.getOriginalFilename();

        String name = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);

        FastDFSClient fastDFSClient = new FastDFSClient("classpath:fdfs_client.conf");

        String s = fastDFSClient.uploadFile(file.getBytes(), name);
        System.out.println(s);

        R r = new R();
        r.setMessage(FILE_URL+s);
        r.setStatus("200");

        return r;
    }
}

選擇檔案點選上傳後效果如下
這裡寫圖片描述