3.2日學習打卡----初學FastDFS(二)

3.2日學習打卡

目錄:

  • 3.2日學習打卡
  • SpringBoot整合FastDFS
    • 實戰開發
    • 文件上傳
  • FastDFS集成Nginx
    • 環境搭建

在這里插入圖片描述

SpringBoot整合FastDFS

在這里插入圖片描述
由GitHub大牛tobato在原作者YuQing與yuqih發布的JAVA客戶端基礎上進行了大量重構工作,并于GitHub上發布了FastDFS-Client1.26.5。

主要特性

  • 對關鍵部分代碼加入了單元測試,便于理解與服務端的接口交易,提高接口質量
  • 將以前對byte硬解析風格重構為使用對象+注解的形式,盡量增強了代碼的可讀性
  • 支持對服務端的連接池管理
  • 支持上傳圖片時候檢查圖片格式,并且自動生成縮略圖
  • 在SpringBoot當中自動導入依賴

實戰開發

導入FastDFS依賴jar

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

配置application.yml

# 分布式文件系統FDFS配置
fdfs:#連接時間so-timeout: 1501#超時時間connect-timeout: 601thumb-image:       #縮略圖生成參數width: 150height: 150tracker-list:       #TrackerList參數,支持多個- 192.168.66.100:22122- 192.168.66.101:22122

上傳文件操作

package com.jjy.fastdfsemo;import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.*;@SpringBootTest
class FastDfSemoApplicationTests {@Autowiredprivate FastFileStorageClient fastFileStorageClient;/*** 測試springboot環境下javaapi對分布式會問你系統上傳文件的操作**/@Testpublic void testupload() throws FileNotFoundException {//獲取本地文件File file = new File("C:\\Users\\SF\\Pictures\\聯想鎖屏壁紙\\2.jpg");//創建文件輸入流FileInputStream fileInputStream = new FileInputStream(file);//文件上傳/***文件上傳:參數一:傳輸文件內容的輸入流;* 參數二:文件的size;* 參數三:文件擴展名;* 參數四:描述文件的元數據;返回值:上傳文件在存儲節點的唯一標識(卷名+文件名)*/StorePath storePath = fastFileStorageClient.uploadFile(fileInputStream, file.length(), "jpg", null);//將卷名與文件名一起打印System.out.println(storePath.getFullPath());//將卷名與文件名分別打印System.out.println(storePath.getGroup()+" | "+storePath.getPath());}}

配置SpringBoot的入口類

package com.jjy.fastdfsemo;import com.github.tobato.fastdfs.FdfsClientConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.context.annotation.Import;
import org.springframework.jmx.support.RegistrationPolicy;//獲取帶有連接池的FastDFS Java客戶端
@Import(FdfsClientConfig.class)
// 解決jmx重復注冊bean的問題
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
@SpringBootApplication
public class FastDfSemoApplication {public static void main(String[] args) {SpringApplication.run(FastDfSemoApplication.class, args);}}

文件下載的操作

package com.jjy.fastdfsemo;import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.io.*;@SpringBootTest
class FastDfSemoApplicationTests {@Autowiredprivate FastFileStorageClient fastFileStorageClient;/*** 測試springboot環境下javaapi對分布式會問你系統上傳文件的操作**//*** 測試springboot環境下的javaAPI對分布式文件系統的下載文件的操作* @throws IOException*/@Testpublic void testDownload() throws IOException {/*** 參數一:文件處于存儲節點的卷名;* 參數二:文件在存儲節點的文件名;* 參數三:下載的回調函數;返回值:文件內容的字節數組*/byte[] bytes = fastFileStorageClient.downloadFile("group1", "M00/00/00/wKhCZGXi97mAK1ciAAJgIQIm2Ts043.jpg", new DownloadByteArray());//創建文件輸出流,指定輸出位置及文件名FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\SF\\Pictures\\聯想鎖屏壁紙\\66.jpg");//使用文件輸出流將文件內容字節數組寫出fileOutputStream.write(bytes);//刷新輸出流fileOutputStream.flush();//關閉輸出流fileOutputStream.close();}}

文件上傳

在這里插入圖片描述
引入Thymeleaf視圖解析器

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

下載wangEditor富文本編輯器

wangEditor4 —— 輕量級 web 富文本編輯器,配置方便,使用簡單。

官網:www.wangeditor.com
文檔:www.wangeditor.com/v4

使用CDN的形式引入

<scripttype="text/javascript"src="https://cdn.jsdelivr.net/npm/wangeditor@latest/dist/wangEditor.min.js"
></script>
<script type="text/javascript">const E = window.wangEditorconst editor = new E("#div1")// 或者 const editor = new E(document.getElementById('div1'))editor.create()
</script>

編寫index頁面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>wangEditor demo</title>
</head>
<body><div id="div1"><p>歡迎使用 <b>wangEditor</b> 富文本編輯器</p>
</div></body><scripttype="text/javascript"src="https://cdn.jsdelivr.net/npm/wangeditor@latest/dist/wangEditor.min.js"
></script>
<!-- 引入 wangEditor.min.js -->
<script type="text/javascript">const E = window.wangEditorconst editor = new E('#div1')// 或者 const editor = new E( document.getElementById('div1') )//設置文件上傳的參數名稱editor.config.uploadFileName = 'files'// 配置 server 接口地址editor.config.uploadImgServer = '/upload'// 2Meditor.config.uploadImgMaxSize = 2 * 1024 * 1024editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']// 一次最多上傳 5 個圖片editor.config.uploadImgMaxLength = 5editor.create()
</script></html>

編寫Controller接口

package com.jjy.fastdfsemo.controller;import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;@RestController
public class UploadController {//fastdfs存儲節點的客戶端對象@Autowiredprivate FastFileStorageClient fastFileStorageClient;/*** 圖片的上傳* @param files*/@PostMapping("/upload")public void upload(MultipartFile[] files){//判斷是否上傳圖片if(files != null && files.length != 0 ){for (MultipartFile multipartFile : files){//獲取上傳文件名String filename = multipartFile.getOriginalFilename();//獲取最后一個“.”的下標,并獲取從這個下標的下一個下標開始后的字符作為文件后綴String fileSuffix = filename.substring(filename.lastIndexOf(".") + 1);StorePath storePath = null;try {//上傳文件storePath = fastFileStorageClient.uploadFile(multipartFile.getInputStream(), multipartFile.getSize(), fileSuffix, null);} catch (IOException e) {e.printStackTrace();}//打印返回的文件在存儲節點的唯一標識System.out.println(storePath.getFullPath());}}}}

FastDFS集成Nginx

在這里插入圖片描述
FastDFS集成Nginx的2個原因

  • 為分布式文件系統提供Http服務支持

    通過Nginx的web服務代理訪問分布式文件系統的存儲節點,從而實現通過http請求訪問存儲節點資源。
    在這里插入圖片描述

注意:
src 屬性值圖像文件的 URL。也就是引用該圖像的文件的的絕對路徑或相對路徑。

  • 解決復制延遲問題

    由于FastDFS的同卷的存儲節點之間需要同步,當文件尚未同步完成時,訪問請求到達改節點,獲取的數據將是未同步完的不完整數據,即為復制延遲問題。通過Nginx檢測請求的存儲節點的數據,若該存儲節點的數據尚未同步完成,則將請求轉發至數據的原存儲節點,從而解決復制延遲問題。
    在這里插入圖片描述

環境搭建

下載Fastdfs的Nginx模塊包

cd /usr/local
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
tar -zxvf V1.22.tar.gz

安裝Nginx依賴文件

yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release

下載Nginx軟件包

wget https://nginx.org/download/nginx-1.19.2.tar.gz
cd nginx-1.19.2/

配置Nginx服務器

#建立Makefile文件,檢查Linux系統環境以及相關的關鍵屬性。
./configure --add-module=/usr/local/fastdfs-nginx-module-1.22/src/
#編譯項目,主要將gcc源代碼編譯成可執行的目標文件
make
#根據上一步驟編譯完成的數據安裝到預定的目錄中。
make install

注意:
–add-module:為nginx添加一個fastdfs-nginx-module模塊,值為該模塊在當前系統的路徑
–prefix:指定nginx安裝位置

將Fastdfs軟件包里面的http.conf和mime.types拷貝到/etc/fdfs目錄下

cp /usr/local/src/fastdfs-6.06/conf/mime.types /etc/fdfs/
cp /usr/local/src/fastdfs-6.06/conf/http.conf /etc/fdfs/

配置Nginx的fastdfs模塊,并編輯文件

#拷貝文件
[root@localhost opt]cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
[root@localhost fdfs] vim mod_fastdfs.conf
#保存日志目錄
base_path=/data/fastdfs/storage   
#tracker 服務器的 IP 地址以及端口號
tracker_server=192.168.66.100:22122 
#文件url中是否有group 名
url_have_group_name = true      
#存儲路徑
store_path0=/data/fastdfs/storage  
group_count = 1            #設置組的個數
#然后在末尾添加分組信息,目前只有一個分組,就只寫一個
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/storage

配置Nginx

server {listen    80;server_name  localhost;location ~ /group[1-3]/M00 {alias /data/fastdfs/storage/data;ngx_fastdfs_module;}# 根目錄下返回403location = / {return 403;}# log fileaccess_log  logs/img_access.log access;
}

啟動Ningx服務

# 進入sbin目錄
[root@tracker nginx]# cd sbin/
# 啟動服務 -c:指定配置文件
[root@tracker sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf

查看服務啟動情況

[root@tracker sbin]# ps -ef | grep nginx

啟動追蹤服務與存儲節點服務

[root@tracker sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start
[root@tracker sbin]# fdfs_storaged /etc/fdfs/storage.conf start

上傳圖片測試
將圖片上傳至linux系統后,使用指令上傳至分布式文件系統

[root@tracker fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/xxxxx.png
group1/M00/00/00/wKhyj1wrIUWAL5ASAAAfA8PiO7Y493.png

通過瀏覽器遠程訪問

http://192.168.66.100/group1/M00/00/00/wKhyj1wrIfqAD3NFAAn1fNRE8_M976.png

如果我的內容對你有幫助,請點贊,評論,收藏。創作不易,大家的支持就是我堅持下去的動力
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714993.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714993.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714993.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營Day33 || leetCode 860.檸檬水找零 || 406.根據身高重建隊列 || 452. 用最少數量的箭引爆氣球

860.檸檬水找零 貪心的思路就是&#xff0c;先把最沒用的錢給找出去。本題中&#xff0c;20元沒法花出去&#xff0c;只有10和5能找零&#xff0c;但10只能找零20&#xff0c;而5可以找零10與20&#xff0c;所以就想辦法把10先花出去即可。之后按照收入順序來記錄錢數并選擇找…

現貨大宗商品發售平臺搭建須知

在搭建現貨大宗商品發售平臺時&#xff0c;需要考慮以下關鍵因素&#xff1a; 目標市場分析&#xff1a;首先要明確你的平臺將服務于哪些大宗商品市場&#xff0c;如農產品、金屬、能源等。了解這些市場的特點、參與者、交易規則等&#xff0c;有助于你設計出更符合市場需求的…

chromedriver,Chrome驅動的實時更新

發現自己的selenium項目跑不起來了 效驗驅動版本 下載鏈接(可能需要魔法) https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/ 找到驅動位置 1. 默認安裝路徑&#xff1a;Chrome驅動通常會默認安裝在系…

Python中常用的庫-sklearn的介紹和代碼案例

Python中常用的庫-sklearn的介紹和代碼案例 關注B站查看更多手把手教學&#xff1a; 肆十二-的個人空間-肆十二-個人主頁-嗶哩嗶哩視頻 (bilibili.com) 今天我們來一起說下最近python中常用的機器學習庫-sklearn。 Scikit-learn是一個基于Python的開源機器學習庫&#xff0c;…

詳解JavaScript的函數

詳解 JavaScript 的函數 函數的語法格式 創建函數/函數聲明/函數定義 function 函數名(形參列表) { 函數體 return 返回值; // return 語句可省略 } 函數調用 函數名(實參列表) // 不考慮返回值 返回值 函數名(實參列表) // 考慮返回值 示例代碼 //定義的沒有參數列表&am…

實驗:依賴注入之setter注入

個人名片&#xff1a; &#x1f43c;作者簡介&#xff1a;一名大三在校生&#xff0c;喜歡AI編程&#x1f38b; &#x1f43b;???個人主頁&#x1f947;&#xff1a;落798. &#x1f43c;個人WeChat&#xff1a;hmmwx53 &#x1f54a;?系列專欄&#xff1a;&#x1f5bc;?…

【數據結構與算法】整數二分

問題描述 對一個排好序的數組&#xff0c;要求找到大于等于7的最小位置和小于等于7的最大位置 大于等于7的最小位置 易知從某個點開始到最右邊的邊界都滿足條件&#xff0c;我們要找到這個區域的最左邊的點。 開始二分&#xff01; left指針指向最左邊界&#xff0c;right…

2024-03-01(金融AI行業與大數據生態圈)

1.金融這一塊的算法&#xff0c;不像推薦系統&#xff0c;圖像等領域&#xff0c;金融領域的算法都比較成熟了。現在來說門檻低&#xff0c;屬于初期階段&#xff0c;上升期。 2.反欺詐的數據標簽比較少&#xff0c;有一種“標簽染色”的方法來做反欺詐模型的標簽。 3.常用反…

官宣 | 凱琦供應鏈成為亞馬遜SPN物流服務商!

再播一條喜訊&#xff01;在亞馬遜官方平臺的篩選考核下&#xff0c;凱琦供應鏈近日正式入駐亞馬遜SPN服務商平臺&#xff0c;成為亞馬遜SPN第三方承運商。 這也標志著凱琦9年來在FBA物流領域的服務質量得到了客戶、官方及行業的廣泛認可&#xff0c;未來凱琦將繼續為亞馬遜賣家…

測試開發實習崗---測試用例

目錄 對于抖音投放廣告這項業務&#xff0c;如何設計測試用例get和post的接口如何設計測試用例依賴于登錄狀態的接口如何測試 對于抖音投放廣告這項業務&#xff0c;如何設計測試用例 廣告展示&#xff1a;測試廣告在抖音中的展示情況&#xff0c;包括廣告位置、展示時機、展示…

第六講:函數

函數 1. 函數的概念2. 庫函數2.1 標準庫和頭文件2.2 庫函數的使用方法2.2.1 功能2.2.2 頭文件包含2.2.3 實踐2.2.4 庫函數文檔的一般格式 3. 自定義函數3.1 函數的語法形式3.2 函數的舉例 4. 形參和實參4.1 實參4.2 形參4.3 實參和形參的關系 5. return語句6. 數組做函數參數7.…

ubuntu個人系統軟件安裝配置備忘

1. 替換軟件源 /etc/apt/source.list 2. 安裝必要軟件 安裝基礎軟件 sudo apt update sudo apt install -y python3-pip git vim curl wget clang clang-format flameshot docker升級pip3 python3 -m pip install --upgrade pip 安裝google瀏覽器 https://deb.pkgs.org/…

Excel 按奇數偶數列處理數據

目錄 一. 需求背景1.1 獲取偶數列的數據1.2 奇偶列數據互換 二. 解決方式2.1 為列添加奇偶輔助列2.2 通過公式將奇偶列互換 一. 需求背景 1.1 獲取偶數列的數據 ? 最近在整理歌單&#xff0c;發現部分歌曲沒有歌詞&#xff0c;于是打算自己制作一份。 從網上找到了歌詞&…

JavaScript-關于事件、事件流(捕獲、冒泡)、事件源、常用事件

1.如何注冊事件(如何綁定事件) ? 何為注冊事件&#xff0c;就是給元素添加事件&#xff0c;其方式有傳統注冊事件、方法監聽注冊事件。 0、1級事件&#xff08;傳統注冊事件&#xff09;不允許多個響應程序 我們在元素內或js內使用on的方式就是傳統注冊事件&#xff0c;這種形…

#WEB前端(CSS基礎)

1.實驗&#xff1a;HTML是網頁骨架&#xff0c;CCS是網頁裝修 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; style 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"view…

學習筆記-李沐動手學深度學習(七)(19-21,卷積層、填充padding、步幅stride、多輸入多輸出通道)

總結 19-卷積層 【補充】看評論區建議的卷積動畫視頻 數學中的卷積 【鏈接】https://www.bilibili.com/video/BV1VV411478E/?fromsearch&seid1725700777641154181&vd_sourcee81e116c4ffe5e79d4bc44738263eda4 【可判斷是否為卷積的典型標志】兩個函數中自變量相加…

數據結構項目實戰——通訊錄

c語言通訊錄 前言一、基于動態順序表實現通訊錄1 功能要求2 代碼實現 二、具體代碼實現需要使用的頭文件及宏定義通訊錄所需要的結構體通訊錄的初始化函數通訊錄的添加函數通訊錄的刪除函數比較函數主要函數 通訊錄的查找函數通訊錄的修改函數通訊錄的排序函數通訊錄的打印函數…

項目組合研究的問題

接著上篇項目集&#xff0c;再查了查項目組合研究的問題&#xff0c;項目組合主要關注組織如何有效地管理多個項目以實現戰略目標&#xff0c;以及在資源有限的情況下最大化整體價值。以下是項目組合研究中常遇到的關鍵問題&#xff1a; 戰略一致性&#xff1a; 如何確保項目組…

Salesforce CPQ - 02 - Quote Price

最近又有客戶來咨詢學習Salesforce CPQ&#xff0c;所以本人總結了下近幾年CPQ培訓的一些實際案例拿出來分享給大家&#xff1b; 再次介紹下本人是一位Salesforce十多年的從業者。 先來介紹下Salesforce的價格體系&#xff0c;再介紹下各個Product Price是如何配置及使用的&a…

測試需求平臺8-Arco組件實現產品增改需求

?此系列為整理分享已完結入門搭建《TPM提測平臺》系列的迭代版&#xff0c;擁抱Vue3.0將前端框架替換成字節最新開源的arco.design&#xff0c;其中約60%重構和20%新增內容&#xff0c;定位為從 0-1手把手實現簡單的測試平臺開發教程&#xff0c;內容將囊括基礎、擴展和實戰&a…