其實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下載。