使用docker搭建FastDFS檔案系統
1.首先下載FastDFS檔案系統的docker映象
查詢映象
[[email protected] /]# docker search fastdfs
安裝映象
[[email protected] ~]# docker pull season/fastdfs
[[email protected] ~]# docker images
2.使用docker映象構建tracker容器(跟蹤伺服器,起到排程的作用):
關閉防火牆
[[email protected] /]# systemctl stop firewalld
這裡的防火牆也要關
進入編輯模式:
[[email protected] /]# vi /etc/sysconfig/selinux
將SELINUX的值改成disabled
,如下:
改完配置後重啟
[[email protected] /]# reboot
建立tracker容器
[[email protected] /]# docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker
Tracker伺服器的埠預設是22122,你可以檢視是否啟用埠
[[email protected] /]# netstat -aon | grep 22122
3.使用docker映象構建storage容器(儲存伺服器,提供容量和備份服務):
docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.115.130:22122 -e GROUP_NAME=group1 season/fastdfs storage
4.此時兩個服務都以啟動,進行服務的配置。
進入storage容器,到storage的配置檔案中配置http訪問的埠,配置檔案在fdfs_conf目錄下的storage.conf。
[[email protected] /]# docker exec -it storage bash
[email protected]:/# cd fdfs_conf
[email protected]:/fdfs_conf# more storage.conf
往下拉,你會發現storage容器的ip不是你linux的ip,如下:
接下來,退出storage容器,並將配置檔案拷貝一份出來:
[[email protected] ~]# docker cp storage:/fdfs_conf/storage.conf ~/
[[email protected] ~]# vi ~/storage.conf
將修改後的配置檔案拷貝到storagee的配置目錄下:
[[email protected] ~]# docker cp ~/storage.conf storage:/fdfs_conf/
重新啟動storage容器
[[email protected] ~]# docker stop storage
[[email protected] ~]# docker start storage
檢視tracker容器和storage容器的關聯
[[email protected] ~]# docker exec -it storage bash
[email protected]:/# cd fdfs_conf
[email protected]:/fdfs_conf# fdfs_monitor storage.conf
5.在docker模擬客戶端上傳檔案到storage容器
開啟一個客戶端
[[email protected] 00]# docker run -tid --name fdfs_sh --net=host season/fastdfs sh
更改配置檔案,因為之前已經改過一次了,所以現在直接拷貝
[[email protected] 00]# docker cp ~/storage.conf fdfs_sh:/fdfs_conf/
建立一個txt檔案
[[email protected] 00]# docker exec -it fdfs_sh bash
[email protected]:/# echo hello>a.txt
進入fdfs_conf目錄,並將檔案上傳到storage容器
[email protected]:/# cd fdfs_conf
[email protected]:/fdfs_conf# fdfs_upload_file storage.conf /a.txt
/a.txt:指要上傳的檔案
上傳之後,根據返回的路徑去找a.txt
退出去檢視上傳的txt檔案
[[email protected] ~]# cd ~/store_path/data/00/00
[[email protected] 00]# ls
檢視是否和輸入的值是否相同
[[email protected] 00]# more wKhzg1wGsieAL-3RAAAABncc3SA337.txt
java程式碼上傳檔案演示
參考網址:https://github.com/luhuiguo/fastdfs-client
1.建立模組 SPRINGCLOUD_FASTDFS
2.加入依賴
<!-- 下載jar包的私人倉庫 -->
<repositories>
<repository>
<id>sn</id>
<name>sn</name>
<url>https://oss.sonatype.org/content/repositories/releases/</url>
</repository>
</repositories>
<dependencies>
<!-- 整合mysql -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 整合springmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 連線fastdfs檔案系統 -->
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
3.新增資原始檔 application.yml
server:
port: 8899
fdfs:
# 連線Tracker伺服器超時時間
connect-timeout: 10000
# storage伺服器響應的超時時間
so-timeout: 3000
# trakcer伺服器的數量
tracker-list:
- 192.168.115.131:22122
spring:
datasource:
url: jdbc:mysql://localhost/m1dn
password: ps123456
username: root
driver-class-name: com.mysql.jdbc.Driver
# 上傳檔案的最大的大小
http:
multipart:
max-file-size: 10000000
4.模擬一個檔案上傳
1.上傳(上傳到storage服務的同時,拷貝一份資料到資料庫裡)
upload.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
上傳的方式是post
enctype的格式必須是:multipart/form-data
-->
<form action="myUpload" method="post" enctype="multipart/form-data">
檔案:<input type="file" name="myFile">
<input type="submit" value="上傳">
</form>
</body>
</html>
建立一個UploadController.java (控制層)
@RestController
public class UploadController {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
JdbcTemplate jdbcTemplate;
// MultipartFile是用來接收上傳的檔案
// myFile的名字必須和上傳的表單的名字一樣
@PostMapping("myUpload")
public String upload(MultipartFile myFile) throws IOException {
// myFile.getOriginalFilename():取到檔案的名字
// FilenameUtils.getExtension(""):取到一個檔案的字尾名
String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());
// group1:指storage伺服器的組名
// myFile.getInputStream():指這個檔案中的輸入流
// myFile.getSize():檔案的大小
// 這一行是通過storageClient將檔案傳到storage容器
StorePath uploadFile = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);
// 上傳資料庫
String sql = "insert into file(filename,groupname,filepath) values(?,?,?)";
jdbcTemplate.update(sql, myFile.getOriginalFilename(), uploadFile.getGroup(), uploadFile.getPath());
// 返回它在storage容器的的路徑
return uploadFile.getFullPath();
}
}
我的資料庫
瀏覽器上傳檔案
點選上傳後
進入docker檢視
[[email protected] ~]# cd store_path/data/00/00
2.下載(根據資料庫裡面的id確定storage伺服器中下載的檔案)
download.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 這裡傳資料庫裡的id -->
<a href="fdownload/4">下載</a>
</body>
</html>
控制層
@GetMapping("/fdownload/{id}")
public void download(@PathVariable String id, HttpServletResponse response) throws IOException {
List query = jdbcTemplate.query("select * from file where fileid=" + id, new ColumnMapRowMapper());
Map map = (Map) query.get(0);
String filename = URLEncoder.encode(map.get("filename").toString(), "utf-8"); // 解決中文檔名下載後亂碼的問題
// 告訴瀏覽器 下載的檔名
response.setHeader("Content-Disposition", "attachment; filename=" + filename + "");
String groupName = map.get("groupName").toString();
String filepath = map.get("filepath").toString();
// 將檔案的內容輸出到瀏覽器 fastdfs
byte[] downloadFile = storageClient.downloadFile(groupName, filepath);
response.getOutputStream().write(downloadFile);
}