<?php
//设置脚本的最大执行时间,设置为0则无时间限制
set_time_limit(0);
ini_set ( 'max_execution_time' , '0' );
$file_name = 'aa.zip' ; //本机文件地址
$extension = pathinfo ( $file_name )[ 'extension' ];
$dowload_name = '资料.' . $extension ;
$file_dir = "./" ; //下载文件存放目录
//检查文件是否存在
if (! file_exists ( $file_dir . $file_name )) {
header( 'HTTP/1.1 404 NOT FOUND' );
} else {
//以只读和二进制模式打开文件
$file = fopen ( $file_dir . $file_name , "rb" );
//告诉浏览器这是一个文件流格式的文件
Header( "Content-type: application/octet-stream;name=$dowload_name" );
//请求范围的度量单位
Header( "Accept-Ranges: bytes" );
Header( 'Content-Transfer-Encoding: binary' );
$filesize = filesize ( $file_dir . $file_name );
//$header_array = get_headers($filename, true);(网络文件用这个方式获取大小)
//$filesize = $header_array['Content-Length'];
//Content-Length是指定包含于请求或响应中数据的字节长度
Header( "Accept-Length: " . $filesize );
//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header( "Content-Disposition: attachment; filename=" . basename ( $dowload_name ));
//针对大文件,规定每次读取文件的字节数为10000字节,直接输出数据
$read_buffer = 10000;
//读取文件内容并直接输出到浏览器
//总的缓冲的字节数
$sum_buffer = 0;
//echo fread ( $file, filesize ( $file_dir . $file_name ) );
//只要没到文件尾,就一直读取
while (! feof ( $file ) && $sum_buffer < $filesize ) {
echo fread ( $file , $read_buffer );
flush (); //输出缓冲(切记,没有清楚缓存,下载会中断)
ob_flush();
$sum_buffer += $read_buffer ;
}
fclose( $file );
exit ();
}
|