一、 index.php中: ?php echo a href='process.php?filename=halo.mp3'下载/a? process.php中: ?php header(Content-type: application/octet-stream);header('Content-Disposition: attachment; filename='. basename($_GET['filename']).'');header(Cont

一、

index.php中:

echo "下载"

?>

process.php中:

header("Content-type: application/octet-stream");

header('Content-Disposition: attachment; filename="'. basename($_GET['filename']).'"');

header("Content-Length: ". filesize($_GET['filename']));

readfile($_GET['filename']);

?>

这是最简单的方法,但是有个问题:如果请求的路径中包含中文,那么下载的文件名有可能就是乱码。

二、

针对上面问题的解决方案,index.php中:

echo "下载"

?>

process.php中:

header("Content-type: application/octet-stream");

//处理中文文件名

$ua = $_SERVER["HTTP_USER_AGENT"];

$encoded_filename = urlencode($_GET['filename']);

$encoded_filename = str_replace("+", "%20", $encoded_filename);

if (preg_match("/MSIE/", $ua)) {

header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');

} else if (preg_match("/Firefox/", $ua)) {

header("Content-Disposition: attachment; filename*=\"utf8''" . $_GET['filename'] . '"');

} else {

header('Content-Disposition: attachment; filename="' . $_GET['filename'] . '"');

}

header("Content-Length: ". filesize($_GET['filename']));

readfile($_GET['filename']);

?>

输出的时候,如果是Apache+PHP,那么还需要发送到Apache的输出缓冲区,最后才发送给用户。而对于Nginx+fpm,如果它们分开部署的话,那还会带来额外的网络IO。

三、

现在貌似没有问题了,但是readfile还是有问题的,虽然PHP的readfile尝试实现的尽量高效,不占用PHP本身的内存,但是实际上它还是需要采用MMAP(如果支持),或者是一个固定的buffer去循环读取文件,直接输出。

那么能不能绕过PHP这层呢,直接由webserver把文件发送给用户呢?可以的,我们可以使用Apache的module mode_xsendfile,让Apache直接发送这个文件给用户。

代码实现如下:(process.php)

header("Content-type: application/octet-stream");

//处理中文文件名

$ua = $_SERVER["HTTP_USER_AGENT"];

$encoded_filename = urlencode($_GET['filename']);

$encoded_filename = str_replace("+", "%20", $encoded_filename);

if (preg_match("/MSIE/", $ua)) {

header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');

} else if (preg_match("/Firefox/", $ua)) {

header("Content-Disposition: attachment; filename*=\"utf8''" . $_GET['filename'] . '"');

} else {

header('Content-Disposition: attachment; filename="' . $_GET['filename'] . '"');

}

//让Xsendfile发送文件

header("X-Sendfile: $_GET['filename']");

最后,如果愿意的话,可以先判断后缀,因为有时候图片当成文件下载也会引起一些不方便的:

$type = strrchr($_GET['filename'], "."); //获取后缀

if($type == "jpg" || "png" || "gif"){

header("Content-Disposition: filename=$_GET['filename']"); //这里我试过,加引号的话,下载时会加到文件名中

header("Content-Type: image/$type");

}

php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...相关推荐

  1. php a链接跳转下载,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件...

    之前做项目遇到这样一个问题,就是在php环境下,用a标签的href链接到一个资源,比如是mp3或者lrc文件时,点击之后不是出现保存文件的提示,而是调用本地程序打开文件或者直接在浏览器上解析.网上说可 ...

  2. PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件

    之前做项目遇到这样一个问题,就是在php环境下,用a标签的href链接到一个资源,比如是mp3或者lrc文件时,点击之后不是出现保存文件的提示,而是调用本地程序打开文件或者直接在浏览器上解析.网上说可 ...

  3. 实现php a标签文件,HTML_如何点击a标签实现弹出input file上传文件对话框,html 复制代码代码如下: SPAN - phpStudy...

    如何点击a标签实现弹出input file上传文件对话框 html 复制代码代码如下: <div> <a href="###">添加图片a> < ...

  4. 点击a标签不跳转链接

    a标签已经设置href的情况下不做跳转动作,直接给a标签添加一个点击事件就行了. html代码: <div id="hf"> <a href="www. ...

  5. emWin GUIBuilder V5.40a 无法保存文件问题解决方案

    今天将STM32Cube_FW_F4_V1.19.0文件夹换了一个位置,再打开GUIBuilder之后发现就无法保存文件了.后来发现,原来是GUIBuilder的工程目录没有配置好. 解决方案:用文本 ...

  6. 文件上传服务器保存形式,78.上传文件及在服务器保存文件到任意路径

    上传文件到服务器是一个常用的操作,而在服务器上保存文件就需要多多用心了.因为你不可能只在一个路径里保存文件,所以需要实践一下保存文件到任意位置.当然,前提是你的应用程序有这样的操作权限. 首先建立一个 ...

  7. vim的保存文件和退出命令

    vim的保存文件和退出命令 命令 简单说明 :w 保存编辑后的文件内容,但不退出vim编辑器.这个命令的作用是把内存缓冲区中的数据写到启动vim时指定的文件中. :w! 强制写文件,即强制覆盖原有文件 ...

  8. php如何实现区分编辑,php实现编辑和保存文件的方法

    php实现编辑和保存文件的方法 发布于 2015-09-26 11:54:35 | 66 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Prep ...

  9. dedecms系统列表页调用tag标签同时带上链接的方法

    小编给大家分享一下dedecms系统列表页调用tag标签同时带上链接的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!  dedecms系统列表页如何调用tag标签同时带上链接?  织 ...

最新文章

  1. python图片识别-用10行Python代码进行图像识别
  2. Linux磁盘管理基础学习
  3. 天翼云从业认证课后习题(3.3天翼云网络产品)
  4. nagios错误: 无法打开要更新的命令文件
  5. Java爬虫搜索原理实现
  6. 开始用Tornado:从Hello World开始
  7. ae中心点重置工具_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...
  8. 若依项目如何打war包后在tomcat中运行呢?
  9. 关于SQL Server自动备份无法删除过期的备份文件奇怪现象
  10. java中的集合_Java 集合介绍,常用集合类
  11. AOJ 0525 Osenbei
  12. 软硬件融合新时代——让软件够灵活,硬件够高效,鱼和熊掌可兼得
  13. 【优化算法】气味代理优化算法(SAO)【含Matlab源码 1131期】
  14. spawn xelatex ENOENT的问题
  15. php中文网怎么修改头像,thinkphp 头像上传在线剪切编辑问题 (使用美图秀秀头像编辑器组件)...
  16. Layui form提交阻止刷新的方法(附damo案例和源码)
  17. dnf全部使用_DNF所有职业通用的CD配装分享 技能无限制使用
  18. 机器学习之决策树实践:隐形眼镜类型预测
  19. 黑苹果适合什么用途?_黑苹果系统,Ozmosis和四叶草、变色龙相比有什么区别和优势?...
  20. python 将变量保存到文件里

热门文章

  1. LeetCode 456. 132模式(逆序遍历+单调栈)
  2. LeetCode 475. 供暖器(双指针二分查找)
  3. LeetCode 40. 组合总和 II(排列组合 回溯)
  4. 怎样从php转向java_Github标星10.8K!Java 实战博客项目分享
  5. python面试总结(三)拷贝与通信
  6. Powerbi实现帕累托分析
  7. 卷积神经网络中十大令人拍案叫绝的操作
  8. 美团容器平台架构及容器技术实践
  9. 复杂语境下的实体关系抽取
  10. 基于PaddleRec的用户点击率预测