Während des Entwicklungsprozesses ist es bei der Begegnung mit der Herunterladen großer Dateien einfach, dass die ReadFile () -Funktion von PHP verwendet wird. Für super große Dateien führt jedoch das direkte Lesen der gesamten Dateiausgabe zu einer übermäßigen Speicherverwendung oder sogar zu Überlauf. Daher ist es notwendig, eine effizientere Download -Lösung zu übernehmen, um die Programmstabilität und die Benutzererfahrung zu gewährleisten.
Durch Breakpoint Continuation können Benutzer nach dem Download weiterhin vom Interrupt -Standort heruntergeladen werden, ohne wiederholt fertige Teile herunterzuladen. Dies spart nicht nur die Bandbreite, sondern verbessert auch die Download -Zuverlässigkeit und die Benutzerzufriedenheit, insbesondere wenn die Netzwerkumgebung instabil ist.
Verwenden Sie zunächst $ _get , um die vom Client übergebenen Dateipfadparameter zu erhalten, und verwenden Sie die Funktion BaseName (), um den Dateinamen zu extrahieren, um Sicherheitsrisiken wie das Verzeichniskreuzung zu vermeiden.
$file = $_GET['file'];
$filename = basename($file);
Teilen Sie dem Browser mit, dass es sich um einen Binärdateistrom handelt, indem Sie den Inhaltstyp auf Anwendung/Oktettstrom einstellen. Legen Sie auch den Header für die Inhaltsdisposition fest, um den Anhang Download und den Dateinamen anzugeben.
Laut HTTP_Range im Anforderungsheader ist der Download -Startort analysiert und der Dateizeiger wird mit FSEEK () angepasst, um eine kontinuierliche Übertragung von Haltepunkten zu erreichen.
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE'];
preg_match('/bytes=(\d+)-/', $range, $matches);
$start = intval($matches[1]);
fseek($file, $start);
}
Lesen Sie durch die Durchschleifen des Dateiinhalts jedes Mal einen Puffer einer bestimmten Größe (z. B. 4096 -Bytes), geben Sie ihn allmählich in den Browser aus und aktualisieren Sie den Ausgangspuffer, um die zeitnahe Datenübertragung sicherzustellen.
$buffer_size = 4096;
while (!feof($file)) {
echo fread($file, $buffer_size);
ob_flush();
flush();
}
Durch die obige Methode kann PHP die Unterbrechung der Haltepunkte von Super-Large-Dateien effizient unterstützen und die Mängel der herkömmlichen ReadFile () -Funktion in großer Dateiverarbeitung lösen. Entwickler können auch die Download -Fortschrittsanzeige, die Tempo -Limit -Steuerung und andere Funktionen implementieren, um die Benutzererfahrung weiter zu verbessern.
Die rationale Verwendung der Funktionsfunktionen des Bereichs Header und PHP -Datei des HTTP -Protokolls kann den Download -Service stabiler und flexibler machen und für verschiedene praktische Geschäftsszenarien geeignet sind.