php点链接直接现在文件吗,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而...
一、 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做链接时,直接保存文件(任何类型),而...相关推荐
- php a链接跳转下载,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件...
之前做项目遇到这样一个问题,就是在php环境下,用a标签的href链接到一个资源,比如是mp3或者lrc文件时,点击之后不是出现保存文件的提示,而是调用本地程序打开文件或者直接在浏览器上解析.网上说可 ...
- PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件
之前做项目遇到这样一个问题,就是在php环境下,用a标签的href链接到一个资源,比如是mp3或者lrc文件时,点击之后不是出现保存文件的提示,而是调用本地程序打开文件或者直接在浏览器上解析.网上说可 ...
- 实现php a标签文件,HTML_如何点击a标签实现弹出input file上传文件对话框,html 复制代码代码如下: SPAN - phpStudy...
如何点击a标签实现弹出input file上传文件对话框 html 复制代码代码如下: <div> <a href="###">添加图片a> < ...
- 点击a标签不跳转链接
a标签已经设置href的情况下不做跳转动作,直接给a标签添加一个点击事件就行了. html代码: <div id="hf"> <a href="www. ...
- emWin GUIBuilder V5.40a 无法保存文件问题解决方案
今天将STM32Cube_FW_F4_V1.19.0文件夹换了一个位置,再打开GUIBuilder之后发现就无法保存文件了.后来发现,原来是GUIBuilder的工程目录没有配置好. 解决方案:用文本 ...
- 文件上传服务器保存形式,78.上传文件及在服务器保存文件到任意路径
上传文件到服务器是一个常用的操作,而在服务器上保存文件就需要多多用心了.因为你不可能只在一个路径里保存文件,所以需要实践一下保存文件到任意位置.当然,前提是你的应用程序有这样的操作权限. 首先建立一个 ...
- vim的保存文件和退出命令
vim的保存文件和退出命令 命令 简单说明 :w 保存编辑后的文件内容,但不退出vim编辑器.这个命令的作用是把内存缓冲区中的数据写到启动vim时指定的文件中. :w! 强制写文件,即强制覆盖原有文件 ...
- php如何实现区分编辑,php实现编辑和保存文件的方法
php实现编辑和保存文件的方法 发布于 2015-09-26 11:54:35 | 66 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Prep ...
- dedecms系统列表页调用tag标签同时带上链接的方法
小编给大家分享一下dedecms系统列表页调用tag标签同时带上链接的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧! dedecms系统列表页如何调用tag标签同时带上链接? 织 ...
最新文章
- python图片识别-用10行Python代码进行图像识别
- Linux磁盘管理基础学习
- 天翼云从业认证课后习题(3.3天翼云网络产品)
- nagios错误: 无法打开要更新的命令文件
- Java爬虫搜索原理实现
- 开始用Tornado:从Hello World开始
- ae中心点重置工具_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...
- 若依项目如何打war包后在tomcat中运行呢?
- 关于SQL Server自动备份无法删除过期的备份文件奇怪现象
- java中的集合_Java 集合介绍,常用集合类
- AOJ 0525 Osenbei
- 软硬件融合新时代——让软件够灵活,硬件够高效,鱼和熊掌可兼得
- 【优化算法】气味代理优化算法(SAO)【含Matlab源码 1131期】
- spawn xelatex ENOENT的问题
- php中文网怎么修改头像,thinkphp 头像上传在线剪切编辑问题 (使用美图秀秀头像编辑器组件)...
- Layui form提交阻止刷新的方法(附damo案例和源码)
- dnf全部使用_DNF所有职业通用的CD配装分享 技能无限制使用
- 机器学习之决策树实践:隐形眼镜类型预测
- 黑苹果适合什么用途?_黑苹果系统,Ozmosis和四叶草、变色龙相比有什么区别和优势?...
- python 将变量保存到文件里