使用php的header实现下载功能

<?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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值