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下载。

相关文章
相关标签/搜索