分布式存儲和集中存儲,pom文件報錯_FastDFS實戰總結,分布式文件存儲,高并發高可用,看這篇就夠了...

 2023-12-10 阅读 25 评论 0

摘要:1、環境準備1.1、使用的系統軟件1.2、編譯環境yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y1.3、磁盤目錄mkdir /home/dfs #創建數據存儲目錄cd /usr/local/src #切換到安裝目錄準備下載安

1、環境準備

1.1、使用的系統軟件

b1909f7f38a09fa4d5f8af0a76f3b8e6.png

1.2、編譯環境

yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

1.3、磁盤目錄

60a4cab0e2efd6fb75c551c366ea2c1d.png
mkdir /home/dfs #創建數據存儲目錄cd /usr/local/src #切換到安裝目錄準備下載安裝包

1.4、安裝libfatscommon

git clone https://github.com/happyfish100/libfastcommon.git --depth 1 #如果下載慢可使用gitee地址:git clone https://gitee.com/fastdfs100/libfastcommon.git --depth 1cd libfastcommon/./make.sh && ./make.sh install  #編譯安裝

1.5、安裝FastDFS

cd ../ #返回上一級目錄git clone https://github.com/happyfish100/fastdfs.git --depth 1# 如果下載慢可使用gitee地址:git clone https://gitee.com/fastdfs100/fastdfs.git --depth 1cd fastdfs/./make.sh && ./make.sh install #編譯安裝#配置文件準備cp /etc/fdfs/tracker.conf.sample  /etc/fdfs/tracker.confcp /etc/fdfs/storage.conf.sample  /etc/fdfs/storage.confcp /etc/fdfs/client.conf.sample  /etc/fdfs/client.conf #客戶端文件,測試用cp /usr/local/src/fastdfs/conf/http.conf  /etc/fdfs/ #供nginx訪問使用cp /usr/local/src/fastdfs/conf/mime.types  /etc/fdfs/ #供nginx訪問使用

1.6、安裝fastdfs-nginx-module

cd ../ #返回上一級目錄git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1# 如果下載慢可使用gitee地址:git clone https://gitee.com/fastdfs100/fastdfs-nginx-module.git --depth 1cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf   /etc/fdfs

1.7、安裝nginx

wget http://nginx.org/download/nginx-1.15.4.tar.gz #下載nginx壓縮包tar -zxvf nginx-1.15.4.tar.gz #解壓cd nginx-1.15.4/#添加fastdfs-nginx-module模塊  ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ make && make install   #編譯安裝

2、單機部署

2.1、tracker配置

#服務器ip為: 192.168.52.1#我建議用ftp下載下來這些文件 本地修改vim /etc/fdfs/tracker.conf#需要修改的內容如下port=22122  # tracker服務器端口(默認22122,一般不修改)base_path=/home/dfs   # 存儲日志和數據的根目錄

2.2、storage配置

vim /etc/fdfs/storage.conf#需要修改的內容如下port=23000  # storage服務端口(默認23000,一般不修改)base_path=/home/dfs  # 數據和日志文件存儲根目錄store_path0=/home/dfs  # 第一個存儲目錄tracker_server=192.168.52.1:22122  # tracker服務器IP和端口http.server_port=8888  # http訪問文件的端口(默認8888,看情況修改,和nginx中保持一致)

2.3、client測試

vim /etc/fdfs/client.conf#需要修改的內容如下base_path=/home/dfstracker_server=192.168.52.1:22122    #tracker服務器IP和端口#保存后測試,返回ID表示成功 如:group1/M00/00/00/xx.tar.gzfdfs_upload_file /etc/fdfs/client.conf  /usr/local/src/nginx-1.15.4.tar.gz

2.4、配置nginx訪問

vim /etc/fdfs/mod_fastdfs.conf#需要修改的內容如下tracker_server=192.168.52.1:22122  #tracker服務器IP和端口url_have_group_name=truestore_path0=/home/dfs#配置nginx.configvim /usr/local/nginx/conf/nginx.conf#添加如下配置server {        listen       8888;    ## 該端口為storage.conf中的http.server_port相同        server_name  localhost;       location ~/group[0-9]/ {                ngx_fastdfs_module;       }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }}#測試下載,用外部瀏覽器訪問剛才已傳過的nginx安裝包,引用返回的IDhttp://192.168.52.1:8888/group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz#彈出下載單機部署全部跑通

3、分布式部署

3.1、tracker配置

#服務器ip為:192.168.52.2,192.168.52.3,192.168.52.4#我建議用ftp下載下來這些文件 本地修改vim /etc/fdfs/tracker.conf#需要修改的內容如下port=22122  # tracker服務器端口(默認22122,一般不修改)base_path=/home/dfs  # 存儲日志和數據的根目錄

3.2、storage配置

vim /etc/fdfs/storage.conf#需要修改的內容如下port=23000  # storage服務端口(默認23000,一般不修改)base_path=/home/dfs  # 數據和日志文件存儲根目錄store_path0=/home/dfs  # 第一個存儲目錄tracker_server=192.168.52.2:22122  # 服務器1tracker_server=192.168.52.3:22122  # 服務器2tracker_server=192.168.52.4:22122  # 服務器3http.server_port=8888  # http訪問文件的端口(默認8888,看情況修改,和nginx中保持一致)

3.3、client測試

vim /etc/fdfs/client.conf#需要修改的內容如下base_path=/home/moe/dfstracker_server=192.168.52.2:22122  # 服務器1tracker_server=192.168.52.3:22122  # 服務器2tracker_server=192.168.52.4:22122  # 服務器3#保存后測試,返回ID表示成功 如:group1/M00/00/00/xx.tar.gzfdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz

3.4、配置nginx訪問

vim /etc/fdfs/mod_fastdfs.conf#需要修改的內容如下tracker_server=192.168.52.2:22122  # 服務器1tracker_server=192.168.52.3:22122  # 服務器2tracker_server=192.168.52.4:22122  # 服務器3url_have_group_name=truestore_path0=/home/dfs#配置nginx.configvim /usr/local/nginx/conf/nginx.conf#添加如下配置server {        listen       8888;    ## 該端口為storage.conf中的http.server_port相同       server_name  localhost;        location ~/group[0-9]/ {              ngx_fastdfs_module;        }        error_page   500 502 503 504  /50x.html;        location = /50x.html {       root   html;        }}

4、啟動

4.1、防火墻

#不關閉防火墻的話無法使用systemctl stop firewalld.service #關閉systemctl restart firewalld.service #重啟

4.2、tracker

/etc/init.d/fdfs_trackerd start #啟動tracker服務/etc/init.d/fdfs_trackerd restart #重啟動tracker服務/etc/init.d/fdfs_trackerd stop #停止tracker服務chkconfig fdfs_trackerd on #自啟動tracker服務

4.3、storage

/etc/init.d/fdfs_storaged start #啟動storage服務/etc/init.d/fdfs_storaged restart #重動storage服務/etc/init.d/fdfs_storaged stop #停止動storage服務chkconfig fdfs_storaged on #自啟動storage服務

4.4、nginx

/usr/local/nginx/sbin/nginx #啟動nginx/usr/local/nginx/sbin/nginx -s reload #重啟nginx/usr/local/nginx/sbin/nginx -s stop #停止nginx

4.5、檢測集群

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf# 會顯示會有幾臺服務器 有3臺就會 顯示 Storage 1-Storage 3的詳細信息

5、說明

5.1、配置文件

tracker_server #有幾臺服務器寫幾個group_name #地址的名稱的命名bind_addr #服務器ip綁定store_path_count #store_path(數字)有幾個寫幾個store_path(數字) #設置幾個儲存地址寫幾個 從0開始

5.2、可能遇到的問題

如果不是root 用戶 你必須在除了cd的命令之外 全部加sudo如果不是root 用戶 編譯和安裝分開進行 先編譯再安裝如果上傳成功 但是nginx報錯404 先檢查mod_fastdfs.conf文件中的store_path0是否一致如果nginx無法訪問 先檢查防火墻 和 mod_fastdfs.conf文件tracker_server是否一致如果不是在/usr/local/src文件夾下安裝 可能會編譯出錯如果 unknown directive "ngx_fastdfs_module" in /usr/local/nginx/conf/nginx.conf:151,可能是nginx一直是啟動的,必須要重啟nginx才可以,`nginx -s reload`無效。

6、 FastDFS java client SDK 使用

6.1、構建jar包

第一種方式: 使用maven從源碼安裝

gitee源碼地址:https://gitee.com/fastdfs100/fastdfs-client-java.git

分布式存儲和集中存儲。github源碼地址:https://github.com/happyfish100/fastdfs-client-java.git

使用git clone 克隆源碼到本地倉庫,然后執行 mvn clean install 即可。

這里需要注意直接install的話只能打包源碼生成jar,但是沒有源碼,如果遇到問題調試不方便,所以在源碼的pom.xml中添加源碼打包插件,這樣在執行install后jar包和源碼包都會生成。如下:

org.apache.maven.plugins    maven-source-plugin    3.0.1        true    compilejar

maven本地倉庫有但是pom報錯?第二種方式: 使用maven從jar文件安裝到maven倉庫

打開命令行,輸入如下命令:

mvn install:install-file -Dfile=jar包的位置 -DgroupId=上面的groupId -DartifactId=上面的artifactId -Dversion=上面的version -Dpackaging=jar 

真實案例如下:

mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=1.29-SNAPSHOT -Dpackaging=jar -Dfile=F:mav3epositoryorgcsourcefastdfs-client-javafastdfs-client-java-1.29-SNAPSHOT.jar

分布式存儲技術有哪些、完成以上步驟后,添加maven依賴jar包:

org.csourcefastdfs-client-java1.29-SNAPSHOT

6.2、單機環境需對外開放端口

環境配置好以后需要在linux服務器開放如下端口,否則客戶端無法訪問,報連接超時。

第一:nginx的服務端口:8888

第二:tracker server的端口:22122

第三:storage server的端口:23000

6.3、安全訪問處理

增加token和時間戳防止盜鏈,步驟如下:

第一步:將token設置為true,并且生成一個密鑰,這個密鑰至關重要放在服務端,泄露后會產生安全問題,具體生成方法建議生成一個UUID然后用md5加密后用作密鑰。

fastdfs.http_anti_steal_token=truefastdfs.http_secret_key=64edb5dd9fd277cb0686d56f1c634266

第二步:修改linux服務器安裝的配置文件http.conf,一般存放地址為:/etc/fdfs/http.conf 。注意,這里的secretkey的值要和上面生成的密鑰值保持一致。tokencheck_fail可以注釋,也可以保留,保留建議配置一個可以訪問的正確路徑。

# if use token to anti-steal# default value is false (0)http.anti_steal.check_token = true# token TTL (time to live), seconds# default value is 600http.anti_steal.token_ttl = 900# secret key to generate anti-steal token# this parameter must be set when http.anti_steal.check_token set to true# the length of the secret key should not exceed 128 byteshttp.anti_steal.secret_key = 64edb5dd9fd277cb0686d56f1c634266# return the content of the file when check token fail# default value is empty (no file sepecified)http.anti_steal.token_check_fail = /home/dfs/123456.png

第三步:重啟服務

/etc/init.d/fdfs_trackerd restart #重啟動tracker服務/etc/init.d/fdfs_storaged restart #重動storage服務/usr/local/nginx/sbin/nginx -s reload #重啟nginx

第四步:創建生成安全訪問地址的方法。這里的secret要和上面的密鑰保持一致。這里特別強調一點ProtoCommon.getToken方法的第一個參數不包含”組“group,第二個參數是時間戳,第三個參數是密鑰。

/**  * @auther: mk  * @param: 參數說明  * @return: 返回值說明  * @date: 2020/4/21 21:35  * @desc: (fastdfs開啟token和時間戳驗證,防盜鏈)*/@GetMapping(value = "/sys/common/dfsfile/token")public Result getFastDFSToken(@RequestParam(value = "dfsFilePath", required = true) String dfsFilePath) {    String secret = "64edb5dd9fd277cb0686d56f1c634266";    //unix時間戳 以秒為單位    int ts = (int) (System.currentTimeMillis() / 1000);    String token = null;    try {        String remoteFileName = dfsFilePath.substring(dfsFilePath.indexOf("/") + 1);        token = ProtoCommon.getToken(remoteFileName, ts, secret);    } catch (UnsupportedEncodingException e) {        e.printStackTrace();    } catch (NoSuchAlgorithmException e) {        e.printStackTrace();    } catch (MyException e) {        e.printStackTrace();    }    Result result = new Result<>();    if (StrUtil.isBlank(token)) {        result.error500("獲取失敗!");    } else {        StringBuilder sb = new StringBuilder();        sb.append(nginxHost);        sb.append(dfsFilePath);        sb.append("?token=").append(token);        sb.append("&ts=").append(ts);        result.setCode(200);        result.setMessage("獲取成功!");        result.setResult(sb.toString());    }    return result;}

生成訪問地址示例如下:

http://192.168.42.104:8888/group1/M00/00/00/wKgqaF6e_BaACnxTAAHOIjxzNLk072.png?token=31c0b171f6a589fcf539635bd140f4ba&ts=1587477535

第五步:如果經過以上四步發現生成的token驗證無法通過,請檢查確認服務器時間基本是一致的,注意服務器時間不能相差太多,不要相差到分鐘級別。

至此FastDFS防盜鏈配置已完成!!!

6.4、JAVA客戶端接入示例

6.4.1、創建配置文件

在src/main/resource目錄下創建 fastdfs-client.properties 文件,內容如下:

fastdfs.connect_timeout_in_seconds=5fastdfs.network_timeout_in_seconds=30fastdfs.charset=UTF-8fastdfs.http_anti_steal_token=truefastdfs.http_secret_key=64edb5dd9fd277cb0686d56f1c634266fastdfs.http_tracker_http_port=8888fastdfs.tracker_servers=192.168.42.104:22122fastdfs.connection_pool.enabled=truefastdfs.connection_pool.max_count_per_entry=500fastdfs.connection_pool.max_idle_time=3600fastdfs.connection_pool.max_wait_time_in_ms=1000

在springboot的配置文件中添加如下內容:

#fastdfs分布式文件存儲訪問路徑fastdfs.nginx.host=http://192.168.42.104:8888/

6.4.2、創建FastDFS公共調用類

完成fastdfs的上傳、下載、刪除、查看文件信息功能

/** * @auther: mk * @date: 2020/4/21 18:25 * @desc: (fastdfs上傳文件信息) */public class FastDFSFileUtil {    //文件名稱    private String name;    //文件內容    private byte[] content;    //文件擴展名    private String ext;    //文件加密名稱    private String md5;    //元信息:作者名稱    private String author;    public FastDFSFileUtil(String name, byte[] content, String ext, String author) {        this.name = name;        this.content = content;        this.ext = ext;        this.author = author;    }    public FastDFSFileUtil(String name, byte[] content, String ext) {        super();        this.name = name;        this.content = content;        this.ext = ext;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public byte[] getContent() {        return content;    }    public void setContent(byte[] content) {        this.content = content;    }    public String getExt() {        return ext;    }    public void setExt(String ext) {        this.ext = ext;    }    public String getMd5() {        return md5;    }    public void setMd5(String md5) {        this.md5 = md5;    }    public String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }}
import cn.hutool.core.io.resource.ClassPathResource;import org.csource.common.MyException;import org.csource.common.NameValuePair;import org.csource.fastdfs.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Properties;/** * @auther: mk * @date: 2020/4/21 16:34 * @desc: (fastdfs分布式文件存儲工具類) */public class FastDFSUtil {    private static final Logger logger = LoggerFactory.getLogger(FastDFSUtil.class);    private FastDFSUtil() {    }    ;    static {        try {            ClassPathResource resource = new ClassPathResource("fastdfs-client.properties");            Properties properties = new Properties();            properties.load(resource.getStream());            ClientGlobal.initByProperties(properties);        } catch (IOException e) {            e.printStackTrace();        } catch (MyException e) {            e.printStackTrace();        }        System.out.println("ClientGlobal.configInfo(): " + ClientGlobal.configInfo());    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 18:08     * @desc: (fastdfs上傳服務器)     */    public static String[] upload(FastDFSFileUtil fastDFSFile) {        logger.info("File Name: " + fastDFSFile.getName() + "File Length:" + fastDFSFile.getContent().length);        NameValuePair[] meta_list = new NameValuePair[1];        meta_list[0] = new NameValuePair("author", fastDFSFile.getAuthor());        String[] uploadResults = null;        StorageClient storageClient = null;        try {            long startTime = System.currentTimeMillis();            storageClient = getStorageClient();            uploadResults = storageClient.upload_file(fastDFSFile.getContent(), fastDFSFile.getExt(), meta_list);            logger.info("upload_file time used:" + (System.currentTimeMillis() - startTime) + " ms");            if (uploadResults == null && storageClient != null) {                logger.error("upload file fail, error code:" + storageClient.getErrorCode());            }            String groupName = uploadResults[0];            String remoteFileName = uploadResults[1];            logger.info("upload file successfully!!!" + "group_name:" + groupName + ", remoteFileName:" + " " + remoteFileName);        } catch (IOException e) {            logger.error("IO Exception when uploadind the file:" + fastDFSFile.getName(), e);        } catch (MyException e) {            logger.error("Non IO Exception when uploadind the file:" + fastDFSFile.getName(), e);        } finally {            if (storageClient != null) {                try {                    storageClient.close();                } catch (Exception e) {                    e.printStackTrace();                } catch (Throwable e) {                    e.printStackTrace();                }            }        }        return uploadResults;    }    public static FileInfo getFile(String groupName, String remoteFileName) {        StorageClient storageClient = null;        try {            storageClient = getStorageClient();            return storageClient.get_file_info(groupName, remoteFileName);        } catch (IOException e) {            logger.error("IO Exception: Get File from Fast DFS failed", e);        } catch (MyException e) {            logger.error("Non IO Exception: Get File from Fast DFS failed", e);        } finally {            if (storageClient != null) {                try {                    storageClient.close();                } catch (Exception e) {                    e.printStackTrace();                } catch (Throwable e) {                    e.printStackTrace();                }            }        }        return null;    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 18:09     * @desc: (fastdfs下載文件)     */    public static InputStream download(String groupName, String remoteFileName) {        StorageClient storageClient = null;        try {            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);        } finally {            if (storageClient != null) {                try {                    storageClient.close();                } catch (Exception e) {                    e.printStackTrace();                } catch (Throwable e) {                    e.printStackTrace();                }            }        }        return null;    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 18:09     * @desc: (fastdfs刪除文件)     */    public static boolean deleteFile(String groupName, String remoteFileName) {        StorageClient storageClient = getStorageClient();        int i = 100;        try {            i = storageClient.delete_file(groupName, remoteFileName);        } catch (IOException e) {            e.printStackTrace();        } catch (MyException e) {            e.printStackTrace();        } finally {            if (storageClient != null) {                try {                    storageClient.close();                } catch (Exception e) {                    e.printStackTrace();                } catch (Throwable e) {                    e.printStackTrace();                }            }        }        if (i == 0) { //@return 0 for success, none zero for fail (error code)            logger.info("delete file successfully!!!" + i);            return true;        } else {            return false;        }    }    public static StorageServer[] getStoreStorages(String groupName) {        TrackerServer trackerServer = null;        StorageServer[] storageServers = null;        try {            TrackerClient trackerClient = new TrackerClient();            trackerServer = trackerClient.getTrackerServer();            storageServers = trackerClient.getStoreStorages(trackerServer, groupName);        } catch (IOException e) {            e.printStackTrace();        } catch (MyException e) {            e.printStackTrace();        }        return storageServers;    }    public static ServerInfo[] getFetchStorages(String groupName, String filename) {        TrackerServer trackerServer = null;        ServerInfo[] serverInfos = null;        try {            TrackerClient trackerClient = new TrackerClient();            trackerServer = trackerClient.getTrackerServer();            serverInfos = trackerClient.getFetchStorages(trackerServer, groupName, filename);        } catch (IOException e) {            e.printStackTrace();        } catch (MyException e) {            e.printStackTrace();        }        return serverInfos;    }    public static String getTrackerUrl() {        return "http://" + getTrackerServer().getInetSocketAddress().getHostString() + ":" + ClientGlobal.getG_tracker_http_port() + "/";    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 17:27     * @desc: (存儲客戶端)     */    private static StorageClient getStorageClient() {        TrackerServer trackerServer = getTrackerServer();        StorageClient storageClient = new StorageClient(trackerServer, null);        return storageClient;    }    private static TrackerServer getTrackerServer() {        TrackerClient trackerClient = new TrackerClient();        TrackerServer trackerServer = null;        try {            trackerServer = trackerClient.getTrackerServer();        } catch (IOException e) {            e.printStackTrace();        }        return trackerServer;    }}

6.4.3、創建業務調用處理公共方法

import cn.hutool.core.util.IdUtil;import cn.hutool.core.util.StrUtil;import org.csource.common.MyException;import org.csource.fastdfs.FileInfo;import org.csource.fastdfs.ProtoCommon;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.multipart.MultipartHttpServletRequest;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.security.NoSuchAlgorithmException;import java.util.HashMap;import java.util.Map;/** * @auther: mk * @param: 參數說明 * @return: 返回值說明 * @date: 2020/4/21 22:29 * @desc: (公共訪問控制器) */@RestControllerpublic class CommonController {    private final Logger log = LoggerFactory.getLogger(CommonController.class);    @Value("${fastdfs.nginx.host}")    String nginxHost;    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 19:46     * @desc: (上傳文件)     */    @PostMapping(value = "/sys/common/upload")    public Result upload(HttpServletRequest request) {        Result result = new Result<>();        try {            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;            MultipartFile mf = multipartRequest.getFile("dfsFile");// 獲取上傳文件對象            if (null != mf) {                String originalFilename = mf.getOriginalFilename();// 獲取文件名                String[] uploadResult = FastDFSUtil.upload(new FastDFSFileUtil(originalFilename, mf.getBytes(), originalFilename.substring(originalFilename.lastIndexOf(".") + 1)));                if (null != uploadResult && uploadResult.length > 0) {                    String dbpath = uploadResult[0] + File.separator + uploadResult[1];                    if (dbpath.contains("")) {                        dbpath = dbpath.replace("", "/");                    }                    Map returnMap = new HashMap<>();                    returnMap.put("name", originalFilename);                    returnMap.put("path", dbpath);                    result.setResult(returnMap);                    result.setMessage("上傳成功!");                    result.setSuccess(true);                } else {                    result.error500("上傳失敗!");                }            }        } catch (IOException e) {            result.error500(e.getMessage());            log.error(e.getMessage(), e);        }        return result;    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 19:46     * @desc: (下載文件)     */    @GetMapping(value = "/sys/common/download")    public void download(@RequestParam(value = "dfsFilePath", required = true) String dfsFilePath,                         @RequestParam(value = "fileName", required = false) String fileName,                         HttpServletResponse response) {        InputStream inputStream = null;        OutputStream outputStream = null;        try {            String groupName = dfsFilePath.substring(0, dfsFilePath.indexOf("/"));            String remoteFileName = dfsFilePath.substring(dfsFilePath.indexOf("/") + 1);            String ext = dfsFilePath.substring(dfsFilePath.lastIndexOf("."));            InputStream is = FastDFSUtil.download(groupName, remoteFileName);            response.setContentType("application/force-download");// 設置強制下載不打開 ? ? ? ? ? ?            response.addHeader("Content-Disposition", "attachment;fileName=" +                    new String((StrUtil.isBlank(fileName) ? IdUtil.simpleUUID() : fileName).getBytes("UTF-8"), "iso-8859-1") + ext);            inputStream = new BufferedInputStream(is);            outputStream = response.getOutputStream();            byte[] buf = new byte[1024];            int len;            while ((len = inputStream.read(buf)) > 0) {                outputStream.write(buf, 0, len);            }            response.flushBuffer();        } catch (Exception e) {            log.error("文件下載失敗" + e.getMessage());        } finally {            if (inputStream != null) {                try {                    inputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if (outputStream != null) {                try {                    outputStream.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 20:06     * @desc: (刪除文件)     */    @GetMapping(value = "/sys/common/delete")    public Result> delete(@RequestParam(value = "dfsFilePath", required = true) String dfsFilePath) {        String groupName = dfsFilePath.substring(0, dfsFilePath.indexOf("/"));        String remoteFileName = dfsFilePath.substring(dfsFilePath.indexOf("/") + 1);        boolean deleteResult = FastDFSUtil.deleteFile(groupName, remoteFileName);        Result> result = new Result<>();        if (deleteResult) {            result.setCode(200);            result.setMessage("刪除成功!");        } else {            result.error500("刪除失敗!");        }        return result;    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 20:34     * @desc: (獲取上傳文件詳細信息)     */    @GetMapping(value = "/sys/common/dfsfile/detail")    public Result detail(@RequestParam(value = "dfsFilePath", required = true) String dfsFilePath) {        String groupName = dfsFilePath.substring(0, dfsFilePath.indexOf("/"));        String remoteFileName = dfsFilePath.substring(dfsFilePath.indexOf("/") + 1);        FileInfo fileInfo = FastDFSUtil.getFile(groupName, remoteFileName);        Result result = new Result<>();        if (null != fileInfo) {            result.setCode(200);            result.setResult(fileInfo);            result.setMessage("獲取成功!");        } else {            result.error500("獲取失敗!");        }        return result;    }    /**     * @auther: mk     * @param: 參數說明     * @return: 返回值說明     * @date: 2020/4/21 21:35     * @desc: (fastdfs開啟token和時間戳驗證,防盜鏈)     */    @GetMapping(value = "/sys/common/dfsfile/token")    public Result getFastDFSToken(@RequestParam(value = "dfsFilePath", required = true) String dfsFilePath) {        String secret = "64edb5dd9fd277cb0686d56f1c634266";        //unix時間戳 以秒為單位        int ts = (int) (System.currentTimeMillis() / 1000);        String token = null;        try {            String remoteFileName = dfsFilePath.substring(dfsFilePath.indexOf("/") + 1);            token = ProtoCommon.getToken(remoteFileName, ts, secret);        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (MyException e) {            e.printStackTrace();        }        Result result = new Result<>();        if (StrUtil.isBlank(token)) {            result.error500("獲取失敗!");        } else {            StringBuilder sb = new StringBuilder();            sb.append(nginxHost);            sb.append(dfsFilePath);            sb.append("?token=").append(token);            sb.append("&ts=").append(ts);            result.setCode(200);            result.setMessage("獲取成功!");            result.setResult(sb.toString());        }        return result;    }}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/194354.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息