Docker搭建分散式檔案系統fastDFS及SpringBoot整合fastDFS
阿新 • • 發佈:2019-01-22
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;
}
}
選擇檔案點選上傳後效果如下