首页 > php教程 > php手册 > 正文

PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而

php中文网
发布: 2016-06-06 19:59:47
原创
1403人浏览过

一、 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中:

<?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("Content-Length: ". filesize($_GET['filename']));

	readfile($_GET['filename']);
?>
登录后复制

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

二、

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

<?php 
	echo "<a href='process.php?filename=halo光环.mp3'>下载</a>"
?>
登录后复制

process.php中:
<?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。

三、

立即学习PHP免费学习笔记(深入)”;

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

来画数字人直播
来画数字人直播

来画数字人自动化直播,无需请真人主播,即可实现24小时直播,无缝衔接各大直播平台。

来画数字人直播 0
查看详情 来画数字人直播

那么能不能绕过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速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号