您的位置:首页 > 编程语言 > PHP开发

使用php的header实现下载功能

2016-09-26 13:08 399 查看
<?php
/**
* Author: Pele <1170420826@qq.com>
*
* 文件下载:
* 一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件。
* 但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作。 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载。
*
* 相关地址:
* http://www.laruence.com/2012/05/02/2613.html * https://my.oschina.net/junn/blog/97699 */

// 当文件名为中文时,可能会出现乱码。
$file = '中文.zip';
// 处理中文文件名
$file = iconv("UTF-8", "GBK", $file);
// 通过这句代码客户端浏览器就能知道服务端返回的文件形式(告诉浏览器文档类型(mime类型); octet-stream指的是二进制文件类型; 下载任何类型的文件都可以这么指定)
header("Content-Type: application/octet-stream");
// 告诉浏览器返回的文件的名称(如果将attachment换成inline意思为在线打开)
header("Content-Disposition: attachment; filename=" . $file);
// 告诉客户端浏览器返回的文件大小是按照字节进行计算的
header("Accept-Ranges: bytes");
// 告诉浏览器返回的文件大小
header("Content-Length: " . filesize($file));
// 传输方式(二进制的)
header("Content-Transfer-Encoding: binary");

/**
* 虽然PHP的readfile尝试实现的尽量高效, 不占用PHP本身的内存,
* 但是实际上它还是需要采用MMAP(如果支持), 或者是一个固定的buffer去循环读取文件, 直接输出。
*
* 输出的时候, 如果是Apache + PHP mod, 那么还需要发送到Apache的输出缓冲区。
* 最后才发送给用户。 而对于Nginx + fpm如果他们分开部署的话, 那还会带来额外的网络IO。
*
* 那么, 能不能不经过PHP这层, 直接让Webserver直接把文件发送给用户呢?
* 我们可以使用Apache的module mod_xsendfile, 让Apache直接发送这个文件给用户。
*
* 让Xsendfile发送文件:
* header("X-Sendfile: $file");
*
* 此外还可以:
* $fp = @fopen($file, "r");
* echo @fread($fp, filesize($file));
* @fclose($fp);
*/
@readfile($file);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php header