小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

FastDFS 使用經(jīng)驗分享 – 運(yùn)維生存時間

 WindySky 2017-09-15

經(jīng)驗一:FastDFS文件下載恢復(fù)原始文件名

應(yīng)用背景

文件被上傳到FastDFS后Storage服務(wù)端將返回的文件索引(FID),其中文件名是根據(jù)FastDFS自定義規(guī)則重新生成的,而不是原始文件名,例如: group2/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk

使用http下載時如不加處理,顯示給用戶的文件名會是這樣的eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk,這樣的用戶體驗很不好。由于FastDFS不會存儲原始文件名,也沒有提供恢復(fù)原始文件名的方法,所以需要應(yīng)用系統(tǒng)自己想辦法恢復(fù)原始文件名。

解決方法

通過在項目中多次嘗試,找到一種較簡單的實現(xiàn)方法,實現(xiàn)過程如下:

一. 應(yīng)用系統(tǒng)在上傳文件到FastDFS成功時將原始文件名“文件索引(FID)”保存下來(例如:保存到數(shù)據(jù)庫)。

二. 用戶點擊下載的時用Nginx的域名FID拼出url,然后在url后面增加一個參數(shù),指定原始文件名。例如:http://121.14.161.48:9030/group2/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk?attname=filename.apk

三. 在Nginx上進(jìn)行如下配置,這樣Nginx就會截獲url中的參數(shù)attname,在Http響應(yīng)頭里面加上字段 Content-Disposition “attachment;filename=$arg_attname”。

1
2
3
4
5
6
7
location /group2/M00 {
root /data/store/data;
if ($arg_attname ~ "^(.*).apk") {
    add_header Content-Disposition "attachment;filename=$arg_attname";
}
ngx_fastdfs_module;
}

四. 瀏覽器發(fā)現(xiàn)響應(yīng)頭里面有Content-Disposition “attachment;filename=$arg_attname”時,就會把文件名顯示成filename指定的名稱。

完整的請求和響應(yīng)消息如下:

請求包:

1
2
3
4
5
6
7
8
9
10
11
12
13
Request URL:http://121.14.161.48:9030/group2/M00/00/89/eQ6h3FKJf_PRl8p4AUz4wO8tqaA688.apk?attname=filename.apk
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Connection:keep-alive
Host:121.14.161.48:9030
Referer:http://appandroidpcfront.test.uae.uc.cn/apps
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Query String Parametersview sourceview URL encoded
attname:filename.apk

返回包:

1
2
3
4
5
6
7
8
Response Headersview source
Accept-Ranges:bytes
Connection:keep-alive
Content-Disposition:attachment;filename=filename.apk
Content-Length:21821632
Date:Thu, 28 Nov 2013 11:40:46 GMT
Last-Modified:Mon, 18 Nov 2013 02:48:19 GMT
Server:nginx/1.4.3

經(jīng)驗二:從文件的使用技巧

應(yīng)用背景

使用FastDFS存儲一個圖片的多個分辨率的備份時,希望只記錄源圖的FID,并能將其它分辨率的圖片與源圖關(guān)聯(lián)??梢允褂脧奈募椒ā?/p>

解決方法

名詞注解:主從文件是指文件ID有關(guān)聯(lián)的文件,一個主文件可以對應(yīng)多個從文件。

  • 主文件ID = 主文件名 + 主文件擴(kuò)展名
  • 從文件ID = 主文件名 + 從文件后綴名 + 從文件擴(kuò)展名

以本場景為例:主文件為原始圖片,從文件為該圖片的一張或多張縮略圖。

流程說明:

  1. 先上傳主文件(即:原文件),得到主文件FID
  2. 然后上傳從文件(即:縮略圖),指定主文件FID和從文件后綴名,上傳后得到從文件FID。

java偽代碼,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public class FastDFSUtils {    
private static Logger logger = Logger.getLogger(FastDFSUtils.class);
static{
    try {
        ClientGlobal.init("D:/WorkSpace/app-filesystem/conf/fdfs_client.conf");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
public static String uploadFile(String filePath) throws Exception{        
    String fileId = "";
    String fileExtName = "";
    if (filePath.contains(".")) {
        fileExtName = filePath.substring(filePath.lastIndexOf(".") + 1);
    } else {
        logger.warn("Fail to upload file, because the format of filename is illegal.");
        return fileId;
    }
    //建立連接
    /*.......*/
    //上傳文件
    try {
        fileId = client.upload_file1(filePath, fileExtName, null);
    } catch (Exception e) {
        logger.warn("Upload file \"" + filePath + "\"fails");
    }finally{
        trackerServer.close();
    }        
    return fileId;
}
public static String uploadSlaveFile(String masterFileId, String prefixName, String slaveFilePath) throws Exception{
    String slaveFileId = "";
    String slaveFileExtName = "";
    if (slaveFilePath.contains(".")) {
        slaveFileExtName = slaveFilePath.substring(slaveFilePath.lastIndexOf(".") + 1);
    } else {
        logger.warn("Fail to upload file, because the format of filename is illegal.");
        return slaveFileId;
    }
    //建立連接
    /*.......*/
    //上傳文件
    try {
        slaveFileId = client.upload_file1(masterFileId, prefixName, slaveFilePath, slaveFileExtName, null);
    } catch (Exception e) {
        logger.warn("Upload file \"" + slaveFilePath + "\"fails");
    }finally{
        trackerServer.close();
    }
    return slaveFileId;
}
public static int download(String fileId, String localFile) throws Exception{  
    int result = 0;
    //建立連接
    TrackerClient tracker = new TrackerClient();
    TrackerServer trackerServer = tracker.getConnection();
    StorageServer storageServer = null;
    StorageClient1 client = new StorageClient1(trackerServer, storageServer);
    //上傳文件
    try {
        result = client.download_file1(fileId, localFile);
    } catch (Exception e) {
        logger.warn("Download file \"" + localFile + "\"fails");
    }finally{
        trackerServer.close();
    }
    return result;
}
public static void main(String[] args) {
    try {
            String masterFileId = uploadFile("D:/Tmp/apk/t01134ede0e696735e7.png");
            System.out.println(masterFileId);
            download(masterFileId, "D:/Tmp/apk/master.png");
            String slaveFileId = uploadSlaveFile(masterFileId, "_120x120", "D:/Tmp/apk/PC.png");
            System.out.println(slaveFileId);
            download(slaveFileId, "D:/Tmp/apk/slave.png");
        } catch (Exception e) {
            logger.error("upload file to FastDFS failed.", e);
        }
    }
}

上面代碼運(yùn)行后打印的文件Id為:

  • 主文件:group1/M00/00/00/wKhbylJx1zkIAAAAAAApPcQL87AAAAAAQCmDxUAAClV522.png
  • 從文件:group1/M00/00/00/wKhbylJx1zkIAAAAAAApPcQL87AAAAAAQCmDxUAAClV522_120x120.png

注意:

FastDFS中的主從文件只是在文件ID上有聯(lián)系。FastDFS server端沒有記錄主從文件對應(yīng)關(guān)系,因此刪除主文件,F(xiàn)astDFS不會自動刪除從文件。刪除主文件后,從文件的級聯(lián)刪除,需要由應(yīng)用端來實現(xiàn)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多