php nginx fastdfs 下載文件重命名

其實fdfs能夠傳入一個filename參數,指定文件名。。 php

M00/00/00/fwAAAVGMateAafjTAAAABBW-xbM368.txt?filename=test.txt  linux

這樣下載時用戶將獲得test.txt文件名啦。 nginx

////如下內容僅供娛樂 數據庫

首先搭好fastdfs 瀏覽器

而後安裝nginx 和 fastdfs-nginx模塊 服務器

配置好nginx 多線程

這裏網上有詳細教程。 併發

如今問題是,咱們下載文件都是fdfs轉換後的文件名,這對於用戶來講是不友好的。 app

好比用戶經過網站上傳一個  小說.txt 的文件,而後提交到fdfs後,文件名將變成一串字母的組合。 網站

當其餘用戶下載的時候,獲得的文件卻不是 小說.txt ,很不友好。

這裏有解決方案。

首先,你能夠經過網站數據庫保存文件的原來文件名。

而後下載的時候,能夠經過php 用readfile()從真實路徑讀取文件,輸出的時候經過指定head頭來改變文件名。

可是用readfile()帶來了額外的I/O開銷,流量一大,會加劇服務器負擔。

這裏還有一種辦法,那就是經過linux自帶的sendfile功能,讓nginx直接從真實地址讀取文件併發送給用戶,而且還能夠重命名。

須要作的就是在 download.php 中,寫入如下頭:

header("Content-Disposition: attachment; filename= 重命名文件名.txt");
header("Content-Type: application/octet-stream");
header('X-Accel-Redirect: M00/00/00/fwAAAVGMateAafjTAAAABBW-xbM368.txt'); //fdfs文件路徑
header("X-Accel-Buffering: yes");
header("X-Accel-Limit-Rate :102400"); //速度限制 Byte/s
//header("Accept-Ranges: none");//單線程 限制多線程


這樣就ok了,當你在瀏覽器中打開download.php時,php輸出這些頭信息,會被nginx捕捉到,而後直接重定向到X-Accel-Redirect這個文件,直接發送給用戶,同時filename頭也是生效的。

這樣作不只隱藏了真實文件地址,並且能夠重命名文件,很好,很強大!

備註:

在 nginx配置文件中

location /M00/

{

    internal;

    root /fdfs_storge/data/;
    ngx_fastdfs_module;

}

這裏面若是加上internal;表示這個url只容許內部訪問,這時候你再直接從瀏覽器中下載fdfs文件,將提示404錯誤。只能經過download.php下載。

相關文章
相關標籤/搜索