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

时间: 2024-08-05 11:29:07

php nginx fastdfs 下载文件重命名的相关文章

关于scrapy下载文件重命名的办法以及对应url没有文件后缀的办法

https://www.jianshu.com/p/d1bb28cbb6a8 scrapy中负责下载文件的是class MyFilesPipeline(FilesPipeline)类 其中负责下载文件的方法是 def file_path(self, request, response=None, info=None): ## start of deprecation warning block (can be removed in the future) def _warn(): from sc

Java用来进行批量文件重命名,批量提取特定类型文件

原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一个一个找出来太麻烦,所以做了第二个功能.       最近刚刚学了Java文件和流的知识,所以正好练练手,这也是自己的第一个exe程序,分享一下哈. (导出jar文件,以及用工具exe4j生成exe文件,这部分省略了哈) 用到的知识: 用到Java中文件,流的知识,以及简单的GUI知识. 功能:  

Python实例31[批量对目录下文件重命名]

经常会遇到下载的文件或电子书,名字中间都包含了一些网址信息,实际使用中由于名字太长不方便,下面的脚本使用正则表达式来对目录下的所有文件重命名:例如: 修改前:[大家网]Mac OS X for Unix Geeks[www.TopSage.com].mobi修改后:Mac OS X for Unix Geeks.mobi python代码如下 import osimport re def rename_dir(dir,regex,f):  if not os.path.isdir(dir) or

用Python写的批量文件重命名

  有些时候下载图片或其他文件,文件名都怪怪的,可选的办法是下载一个文件批量重命名的软件.当然,如果想自己'DIY'一把的话编个Python脚本最好不过了. 下面的代码实现的对指定类型的文件进行批量重命名.拷贝下面的代码到待批量命名的文件夹下,保存为xx.py直接运行,程序会提示需要批量命名的扩展名,以及重命名时的文件前缀. # -*- coding: cp936 -*- """ Created on Wed Jun 25 16:24:23 2014 @author: Adm

利用datafile copy将数据文件重命名

思路: o 利用RMAN对数据文件做copy o 将数据文件offline o switch文件名,这一步将更改控制文件中数据文件对应的文件名 o recover数据文件 o 将数据文件online,恢复生产 注:也可以利用这种思路做DATABASE COPY,然后做SWITCH DATABASE,迁移数据库... 实验过程如下: ====================================== SQL> archive log list; Database log mode    

java 获取文件名(不包括文件的后缀)和文件重命名

获取文件名(不包括后缀) originalFileName.substring(0, originalFileName.lastIndexOf(".")) 文件重命名 public void renameFile(String file, String toFile) { File toBeRenamed = new File(file); //检查要重命名的文件是否存在,是否是文件 if (!toBeRenamed.exists() || toBeRenamed.isDirector

oc NSFileManager 文件夹创建、文件移动、文件复制、文件重命名

// 初始化管理类 NSFileManager * manager = [NSFileManager defaultManager]; // 路径 NSString * DirectoryPath = [NSHomeDirectory() stringByAppendingPathComponent:@"/desktop/我的文件夹1/我的文件夹2"]; NSError * error = nil; if ([manager createDirectoryAtPath:Director

ListView 文件重命名

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, ComCtrls, StdCtrls; type   TForm1 = class(TForm)     ListView1: TListView; ListView2: TListView; Button1: TButton; Edit1: TEdit; Edit2:

文件重命名的几种写法

现在主要的是通过往ZwSetInformationFile发送HANDLE和改名请求 再者就是 往 IoSetInformation 发送FILEOBJECT和改名请求以及我自己模仿iosetinformation写成的创建IRP改名 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 4