最近完善下载类中一个远程下载文件 考虑是不是可以分别分段读取文件内容 最后组合。经测试可行哦~ 这是我测试的本地文件~
我想的是咋个可以最简单封装针对任意本地文件 or远程文件 进行操作! 请看:
<?php
//PHP分段读取文件 这里我只分了两段 实际上可以通过文件大小 按照预定段大小 进行分段..
$file = dirname(__FILE__).'/bullyframework_zend.7z';echo filesize($file);$handle = fopen($file, "rb");$contents = fread($handle, ceil(filesize($file)/2)); //分两次读取文件组合$now_tell = ftell($handle); //获取当前指针$end = fread($handle, filesize($file) - $now_tell); //从当前指针处读取剩余文件fclose($handle);file_put_contents('test.7z', $contents.$end); //写入文件 验证文件是否完整echo "<br>";echo filesize('test.7z');
?>
我想的是咋个可以最简单封装针对任意本地文件 or远程文件 进行操作! 请看:
<?php
//PHP分段读取文件 这里我只分了两段 实际上可以通过文件大小 按照预定段大小 进行分段..
$file = dirname(__FILE__).'/bullyframework_zend.7z';echo filesize($file);$handle = fopen($file, "rb");$contents = fread($handle, ceil(filesize($file)/2)); //分两次读取文件组合$now_tell = ftell($handle); //获取当前指针$end = fread($handle, filesize($file) - $now_tell); //从当前指针处读取剩余文件fclose($handle);file_put_contents('test.7z', $contents.$end); //写入文件 验证文件是否完整echo "<br>";echo filesize('test.7z');
?>
header("Cache-Control:");
header("Cache-Control: public");
header("Content-Type: $ctype"); $filespaces = str_replace("_", " ", $filename);
// if your filename contains underscores, replace them with spaces $header='Content-Disposition: attachment; filename='.$filespaces;
header($header);
header("Accept-Ranges: bytes");
$size = filesize($file);
// check if http_range is sent by browser (or download manager)
if(isset($_SERVER['HTTP_RANGE'])) {
// if yes, download missing part $seek_range = substr($_SERVER['HTTP_RANGE'] , 6);
$range = explode( '-', $seek_range);
if($range[0] > 0) { $seek_start = intval($range[0]); }
if($range[1] > 0) { $seek_end = intval($range[1]); }
header("HTTP/1.1 206 Partial Content");
header("Content-Length: " . ($seek_end - $seek_start + 1));
header("Content-Range: bytes $seek_start-$seek_end/$size");
} else {
header("Content-Range: bytes 0-$seek_end/$size");
header("Content-Length: $size");
}
//open the file
$fp = fopen("$file","rb");
//seek to start of missing part
fseek($fp,$seek_start);
//start buffered download
$n = 0;
while(!feof($fp)) {
//reset time limit for big files
echo fread($fp,1024*$speed);
}
fclose($fp);
exit;