zoukankan      html  css  js  c++  java
  • php nginx fastdfs 下载文件重命名

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

  • 相关阅读:
    JDK的安装及环境变量部署
    计算机常用运行指令
    Linux基础2
    Linux基础1
    Oracle数据库基础(2)
    Oracle数据库的基础(1)
    测试用例的设计
    软件测试基础
    转化课-环境变量
    转化课-计算机基础及上网过程
  • 原文地址:https://www.cnblogs.com/itafter/p/4593827.html
Copyright © 2011-2022 走看看