Heute bin ich einmal wieder auf das Problem gestoß, dass ich mittels PHP eine große Datei herunterladen will ( also dem User zum herunterladen anbieten will)
Dazu gibt es eine sehr schöne Funktion die nicht gleich die gesamte Datei in den Speicher bläßt, sondern nach einander einliest und zum Client sendet. Der nachteil dabei: Die Downloadgeschwindigkeit sinkt etwas je nach geschwindigkeit des Servers.
Ich habe das ganze einmal in eine Klasse zusammengefasst:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php
class download{
public function downloadLargeFile($filepath){
//check if file exists
if(file_exists($filepath)){
//File found
$filename = explode(DIRECTORY_SEPARATOR, $filepath);
$filename = $filename[count($filename)-1];
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-length: ".filesize($filepath));
header("Cache-control: private");
return $this->readfile_chunked($filepath);
} else {
//File not found
return false;
}
}
private function readfile_chunked ($filename) {
$chunksize = 1*(1024*1024); // how many bytes per chunk
$buffer = '';
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunksize);
print $buffer;
}
return fclose($handle);
}
}
?> |