欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringBoot中怎么將文件上傳至FastDFS

SpringBoot中怎么將文件上傳至 FastDFS,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),通江網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:通江等地區(qū)。通江做網(wǎng)站價(jià)格咨詢:13518219792

一、什么是FastDFS

FastDFS 是一個(gè)開源的輕量級(jí)分布式文件系統(tǒng),它解決了大數(shù)據(jù)量存儲(chǔ)和負(fù)載均衡等問題,特別適合以中小文件(建議范圍:4 KB < file_size < 500 MB)為載體的在線服務(wù),如相冊(cè)網(wǎng)站、視頻網(wǎng)站等

FastDFS 由 C 語言開發(fā),支持 Linux、FreeBSD 等 UNIX 系統(tǒng)類 Google FS,不是通用的文件系統(tǒng),只能通過專有 API 訪問,目前提供了 C、Java 和 PHP API,為互聯(lián)網(wǎng)應(yīng)用量身定做,解決了大容量文件存儲(chǔ)問題,追求高性能和高擴(kuò)展性,F(xiàn)astDFS 可以看做是基于文件的 Key Value Pair 存儲(chǔ)系統(tǒng),稱作分布式文件存儲(chǔ)服務(wù)會(huì)更合適。

  1. FastDFS 特性

  • 文件不分塊存儲(chǔ),上傳的文件和 OS 文件系統(tǒng)中的文件一一對(duì)應(yīng)

  • 支持相同內(nèi)容的文件只保存一份,節(jié)約磁盤空間

  • 下載文件支持 HTTP 協(xié)議,可以使用內(nèi)置 Web Server,也可以和其他 Web Server 配合使用

  • 支持在線擴(kuò)容

  • 支持主從文件

  • 存儲(chǔ)服務(wù)器上可以保存文件屬性(meta-data)V2.0 網(wǎng)絡(luò)通信采用 libevent,支持大并發(fā)訪問,整體性能更好

  1. FastDFS 相關(guān)概念

FastDFS 服務(wù)端有三個(gè)角色:跟蹤服務(wù)器(Tracker Server)、存儲(chǔ)服務(wù)器(Storage Server)和客戶端(Client)

  • Tracker Server:跟蹤服務(wù)器,主要做調(diào)度工作,起負(fù)載均衡的作用。在內(nèi)存記錄集群中所有存儲(chǔ)組和存儲(chǔ)服務(wù)器的狀態(tài)信息,是客戶端和數(shù)據(jù)服務(wù)器交互的樞紐。相比 GFS 中的 Master 更為精簡(jiǎn),不記錄文件索引信息,占用的內(nèi)存量很少。

  • Storage Server:存儲(chǔ)服務(wù)器(又稱存儲(chǔ)節(jié)點(diǎn)或數(shù)據(jù)服務(wù)器),文件和文件屬性(Meta Data)都保存到存儲(chǔ)服務(wù)器上。Storage Server 直接利用 OS 的文件系統(tǒng)調(diào)用管理文件。

  • Client:客戶端,作為業(yè)務(wù)請(qǐng)求的發(fā)起方,通過專有接口,使用 TCP/IP 協(xié)議與跟蹤器服務(wù)器或存儲(chǔ)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)交互。FastDFS 向使用者提供基本文件訪問接口,如 upload、download、append、delete 等,以客戶端庫的方式提供給用戶使用。

SpringBoot中怎么將文件上傳至 FastDFS

Tracker 相當(dāng)于 FastDFS 的大腦,不論是上傳還是下載都是通過 Tracker 來分配資源;客戶端一般可以使用 Ngnix 等靜態(tài)服務(wù)器來調(diào)用或者做一部分的緩存;存儲(chǔ)服務(wù)器內(nèi)部分為卷(或者叫做組),卷與卷之間是平行的關(guān)系,可以根據(jù)資源的使用情況隨時(shí)增加,卷內(nèi)服務(wù)器文件相互同步備份,以達(dá)到容災(zāi)的目的。

  1. 上傳機(jī)制

  • 首先客戶端請(qǐng)求 Tracker 服務(wù)獲取到存儲(chǔ)服務(wù)器的 IP 地址和端口;

  • 然后客戶端根據(jù)返回的 IP 地址和端口號(hào)請(qǐng)求上傳文件;

  • 存儲(chǔ)服務(wù)器接收到請(qǐng)求后生產(chǎn)文件,并且將文件內(nèi)容寫入磁盤并返回給客戶端 file_id、路徑信息、文件名等信息,客戶端保存相關(guān)信息上傳完畢。

SpringBoot中怎么將文件上傳至 FastDFS

  1. 下載機(jī)制

  • 客戶端帶上文件名信息請(qǐng)求 Tracker 服務(wù)獲取到存儲(chǔ)服務(wù)器的 IP 地址和端口;

  • 然后客戶端根據(jù)返回的 IP 地址和端口號(hào)請(qǐng)求下載文件,存儲(chǔ)服務(wù)器接收到請(qǐng)求后返回文件給客戶端。

SpringBoot中怎么將文件上傳至 FastDFS

二、Spring Boot 集成 FastDFS

本節(jié)示例項(xiàng)目會(huì)在上一節(jié)項(xiàng)目的基礎(chǔ)上進(jìn)行構(gòu)建開發(fā),從前端上傳文件到后臺(tái)后,直接傳遞到 FastDFS 集群中,并返回文件存儲(chǔ)的地址。

POM包配置

引入 FastDFS 的 Java 客戶端:

<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.27-SNAPSHOT</version>
</dependency>

FastDFS配置

項(xiàng)目 resources 目錄下添加fdfs_client.conf文件,配置文件設(shè)置了連接的超時(shí)時(shí)間、編碼格式以及 tracker_server 地址等信息。

connect_timeout = 60 # 連接超時(shí)時(shí)間
network_timeout = 60 # 網(wǎng)絡(luò)超時(shí)時(shí)間
charset = UTF-8 # 編碼格式
http.tracker_http_port = 8080 #tracker 端口
http.anti_steal_token = no #token 防盜鏈功能
http.secret_key = 123456 #密鑰
# tracer server 列表,多個(gè) tracer server 的話,分行列出
tracker_server = 192.168.53.85:22122
tracker_server = 192.168.53.86:22122

封裝 FastDFS 上傳工具類

封裝 FastDFSFile,文件基礎(chǔ)信息包括文件名、內(nèi)容、文件類型、作者等。

public class FastDFSFile {
    private String name;
    private byte[] content;
    private String ext;
    private String md5;
    private String author;
    //省略getter、setter
}

接下來封裝 FastDFSClient 類,F(xiàn)astDFSClient 主要封裝最基礎(chǔ)的操作,包含上傳、下載、刪除等方法。FastDFSFile 任務(wù)可以是 FastDFS 上傳文件的封裝,操作時(shí)每一個(gè)文件對(duì)應(yīng)一個(gè)實(shí)例。

首先在類加載的時(shí)候讀取配置信息,并進(jìn)行初始化。

static {
    try {
        String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
	//ClientGlobal.init 方法會(huì)讀取配置文件,并初始化對(duì)應(yīng)的屬性。
        ClientGlobal.init(filePath);
    } catch (Exception e) {
        logger.error("FastDFS Client Init Fail!",e);
    }
}
  1. 文件上傳

  • 使用 FastDFS 提供的客戶端 storageClient 來進(jìn)行文件上傳,最后將上傳結(jié)果返回。

public static String[] upload(FastDFSFile file) {
    logger.info("File Name: " + file.getName() + "File Length:" + file.getContent().length);

    //文件屬性信息
    NameValuePair[] meta_list = new NameValuePair[1];
    meta_list[0] = new NameValuePair("author", file.getAuthor());

    long startTime = System.currentTimeMillis();
    String[] uploadResults = null;
    StorageClient storageClient=null;
    try {
        //獲取 
        storageClient = getStorageClient();
        //上傳
        uploadResults = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
    } catch (IOException e) {
        logger.error("IO Exception when uploadind the file:" + file.getName(), e);
    } catch (Exception e) {
        logger.error("Non IO Exception when uploadind the file:" + file.getName(), e);
    }
    logger.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms");

    //驗(yàn)證上傳結(jié)果
    if (uploadResults == null && storageClient!=null) {
        logger.error("upload file fail, error code:" + storageClient.getErrorCode());
    }
    //上傳文件成功會(huì)返回 groupName。
    logger.info("upload file successfully!!!" + "group_name:" + uploadResults[0] + ", remoteFileName:" + " " + uploadResults[1]);
    return uploadResults;
}
  • NameValuePair,主要存儲(chǔ)文件的一些基礎(chǔ)屬性,如作者信息、創(chuàng)建時(shí)間等;

  • getStorageClient(),封裝了獲取客戶端的方法。

首先獲取 TrackerServer 信息,使用 TrackerServer 構(gòu)建出每次操作的客戶端實(shí)例 StorageClient。詳細(xì)代碼如下:

private static StorageClient getStorageClient() throws IOException {
    TrackerServer trackerServer = getTrackerServer();
    StorageClient storageClient = new StorageClient(trackerServer, null);
    return  storageClient;
}

下面為封裝獲取 TrackerServer 的方法:

private static TrackerServer getTrackerServer() throws IOException {
    TrackerClient trackerClient = new TrackerClient();
    TrackerServer trackerServer = trackerClient.getConnection();
    return  trackerServer;
}
  1. 獲取文件

根據(jù) groupName 和文件名獲取文件信息。group 也可稱為卷,同組內(nèi)服務(wù)器上的文件是完全相同的,同一組內(nèi)的 storage server 之間是對(duì)等的,文件上傳、刪除等操作可以在任意一臺(tái) storage server 上進(jìn)行。

public static FileInfo getFile(String groupName, String remoteFileName) {
    try {
        storageClient = new StorageClient(trackerServer, storageServer);
        return storageClient.get_file_info(groupName, remoteFileName);
    } catch (IOException e) {
        logger.error("IO Exception: Get File from Fast DFS failed", e);
    } catch (Exception e) {
        logger.error("Non IO Exception: Get File from Fast DFS failed", e);
    }
    return null;
}
  1. 下載文件

根據(jù) storageClient 的 API 獲取文件的字節(jié)流并返回:

public static InputStream downFile(String groupName, String remoteFileName) {
    try {
        StorageClient storageClient = getStorageClient();
        byte[] fileByte = storageClient.download_file(groupName, remoteFileName);
        InputStream ins = new ByteArrayInputStream(fileByte);
        return ins;
    } catch (IOException e) {
        logger.error("IO Exception: Get File from Fast DFS failed", e);
    } catch (Exception e) {
        logger.error("Non IO Exception: Get File from Fast DFS failed", e);
    }
    return null;
}
  1. 刪除文件

根據(jù)文件名和組刪除對(duì)應(yīng)的文件;當(dāng)使用 FastDFS 時(shí),直接調(diào)用 FastDFSClient 對(duì)應(yīng)的方法即可。

public static void deleteFile(String groupName, String remoteFileName)
        throws Exception {
    StorageClient storageClient = getStorageClient();
    int i = storageClient.delete_file(groupName, remoteFileName);
    logger.info("delete file successfully!!!" + i);
}

編寫上傳控制類

從 MultipartFile 中讀取文件信息,然后使用 FastDFSClient 將文件上傳到 FastDFS 集群中,封裝一個(gè) saveFile() 方法用來調(diào)用上面封裝的 FastDFS 工具類,將 MultipartFile 文件上傳到 FastDFS 中,并返回上傳后文件的地址信息。

public String saveFile(MultipartFile multipartFile) throws IOException {
    String[] fileAbsolutePath={};
    String fileName=multipartFile.getOriginalFilename();
    String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
    byte[] file_buff = null;
    InputStream inputStream=multipartFile.getInputStream();
    if(inputStream!=null){
        int len1 = inputStream.available();
        file_buff = new byte[len1];
        inputStream.read(file_buff);
    }
    inputStream.close();
    FastDFSFile file = new FastDFSFile(fileName, file_buff, ext);
    try {
        fileAbsolutePath = FastDFSClient.upload(file);  //upload to fastdfs
    } catch (Exception e) {
        logger.error("upload file Exception!",e);
    }
    if (fileAbsolutePath==null) {
        logger.error("upload file failed,please upload again!");
    }
    String path=FastDFSClient.getTrackerUrl()+fileAbsolutePath[0]+ "/"+fileAbsolutePath[1];
    return path;
}

當(dāng)上傳請(qǐng)求傳遞到后端時(shí),調(diào)用上面方法 saveFile()。

@PostMapping("/upload") 
public String singleFileUpload(@RequestParam("file") MultipartFile file,
                               RedirectAttributes redirectAttributes) {
    if (file.isEmpty()) {
        redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
        return "redirect:uploadStatus";
    }
    try {
        String path=saveFile(file);
        redirectAttributes.addFlashAttribute("message",
                "You successfully uploaded '" + file.getOriginalFilename() + "'");
        redirectAttributes.addFlashAttribute("path","file path url '" + path + "'");
    } catch (Exception e) {
        logger.error("upload file failed",e);
    }
    return "redirect:/uploadStatus";
}

上傳成功之后,將文件的路徑展示到頁面,效果圖如下:

SpringBoot中怎么將文件上傳至 FastDFS

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

分享標(biāo)題:SpringBoot中怎么將文件上傳至FastDFS
文章網(wǎng)址:http://aaarwkj.com/article16/pcchdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站排名、網(wǎng)站維護(hù)、品牌網(wǎng)站建設(shè)、建站公司、電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
无套内谢少妇高朝毛片| 上海老熟女啪啪露脸高潮| 激情综合婷婷中文字幕| 国产精品青青在线观看爽香蕉| 国产三级在线视频不卡| 国产老太婆精品久久久久| 久久草福利视频在线观看| 久久亚洲中文字幕丝袜长腿| 欧美午夜福利视频网址| 亚洲精品一区二区三区高清| 精品在线免费视频观看| 99蜜桃臀成人美女视频| 91麻豆视频福利视频| 丝袜美腿一区在线播放| 精品人妻一区二区三区观看 | 国产女主播精品视频一区| 国产一区二区三区av网站| 欧美日韩国产另类在线视频| 日本熟妇中文字幕系列| 十八禁在线观看网址免费| 97国产在线视频观看| 国产精品成人亚洲一区二区| 日韩精品一区免费电影| 日韩 欧美 国产 亚洲 综合| 日韩av在线黄色免费大全| 亚洲理论在线观看电影| 国产又粗又长又大又长| 欧美另类不卡在线观看| 亚洲天堂欧美日韩一区| 国产亚洲一区二区视频| 日本三级黄色免费的网站| 青青草视频在线针对华人| 中文字幕日韩一区二区| 国产一区二区三区不卡视频| 一区二区三区欧美黑人| 国产精品久久高清免费| 午夜福利视频欧美成人| 最新亚洲国产高清激情| 午夜福利一区二区在线| 国产精品国产三级国av中文| 日本老太老熟妇一级特黄|