博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php nginx fastdfs 下载文件重命名
阅读量:5321 次
发布时间:2019-06-14

本文共 1233 字,大约阅读时间需要 4 分钟。

其实fdfs可以传入一个filename参数,指定文件名。。

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

这样下载时用户将得到test.txt文件名啦。

以下内容仅供娱乐

首先搭好fastdfs

然后安装nginx 和 fastdfs-nginx模块

配置好nginx

这里网上有详细教程。

现在问题是,我们下载文件都是fdfs转换后的文件名,这对于用户来说是不友好的。

比如用户通过网站上传一个  小说.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下载。

 

转载于:https://www.cnblogs.com/itafter/p/4593827.html

你可能感兴趣的文章
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
实验4 [bx]和loop的使用
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>
C#类与结构体究竟谁快——各种函数调用模式速度评测
查看>>
我到底要选择一种什么样的生活方式,度过这一辈子呢:人生自由与职业发展方向(下)...
查看>>
poj 题目分类
查看>>
windows 安装yaml支持和pytest支持等
查看>>