Heim >Backend-Entwicklung >PHP-Tutorial >Datei in PHP herunterladen
Bei der Entwicklung einer Website oder Anwendung müssen wir häufig die Funktion zum Herunterladen von Dateien implementieren, die einfach über PHP implementiert werden kann. In diesem Artikel wird erläutert, wie Sie PHP zum Implementieren der Datei-Download-Funktion verwenden.
1. Datei-Download-Prozess
Bevor wir die Datei herunterladen, müssen wir den Download-Prozess verstehen:
$file_path = '/path/to/your/file/yourfile.extension'; if (file_exists($file_path)) { header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file_path)); header('Content-Transfer-Encoding: binary'); header('Content-Length: ' . filesize($file_path)); readfile($file_path); exit; } else { die('File not found.'); }
Im obigen Code verwenden wir zunächst die Funktion file_exists, um zu überprüfen, ob die Datei vorhanden ist, und legen Sie die HTTP-Header-Datei fest, um dies dem Browser mitzuteilen Eine Datei soll heruntergeladen werden. Geben Sie den Dateinamen in Content-Disposition an, geben Sie den Dateityp in Content-Type an und verwenden Sie die Funktion readfile, um den Dateiinhalt auszugeben.
3. Verhindern Sie Dateidownloads über gestohlene Links
Aufgrund der Natur des Browsers können einige schädliche Websites Ihre Dateien stehlen, daher müssen wir verhindern, dass Dateidownloads gestohlen werden Kette.
Wir können den folgenden Code hinzufügen, um zu verhindern, dass Dateidownloads gestohlen werden:
$referer = $_SERVER['HTTP_REFERER']; if ($referer && !preg_match('/^https?://' . $_SERVER['SERVER_NAME'] . '/', $referer)) { header("HTTP/1.1 403 Forbidden"); die("Access denied."); }
Dieser Code überprüft die HTTP_REFERER-Header-Informationen und stellt sicher, dass sie mit dem aktuellen Domänennamen übereinstimmen Wenn der Server nicht übereinstimmt, wird der Statuscode 403 zurückgegeben und der Zugriff ist verboten.
4. Segmentierten Download implementieren
Beim Herunterladen größerer Dateien müssen Sie möglicherweise die segmentierte Download-Funktion implementieren, um die Download-Geschwindigkeit zu beschleunigen und die Netzwerkbandbreitennutzung zu reduzieren. Mit Hilfe der Range-Header-Informationen von HTTP 1.1 können wir segmentierte Downloads einfach implementieren.
Das Folgende ist ein Beispielcode:
$file_path = '/path/to/your/file/yourfile.extension'; if (file_exists($file_path)) { $size = filesize($file_path); $start = 0; $end = $size - 1; if (isset($_SERVER['HTTP_RANGE'])) { if (preg_match('/bytes=h*(d+)-(d*)[D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) { $start = intval($matches[1]); if (!empty($matches[2])) { $end = intval($matches[2]); } } } if ($start > $end || $end > $size - 1 || $start < 0) { header('HTTP/1.1 416 Requested Range Not Satisfiable'); header("Content-Range: bytes $start-$end/$size"); exit; } header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($file_path)); header('Content-Transfer-Encoding: binary'); header("Content-Range: bytes $start-$end/$size"); header('Accept-Ranges: bytes'); header('Content-Length: ' . ($end - $start + 1)); header("Cache-control: private"); header('Pragma: private'); header('Expires: ' . gmdate('D, d M Y H:i:s T', time() + 3600)); $fp = fopen($file_path, 'rb'); fseek($fp, $start); $buffer_size = 1024 * 8; //每次读取8 KB $bytes_send = 0; while (!feof($fp) && ($bytes_send < $end - $start + 1)) { $buffer = fread($fp, $buffer_size); echo $buffer; flush(); $bytes_send += strlen($buffer); } fclose($fp); exit; } else { die('File not found.'); }
Im obigen Code überprüfen wir zunächst die Header-Informationen HTTP_RANGE. Wenn die Header-Informationen nicht vorhanden sind, ist die gesamte Datei vorhanden Ausgabe. Wenn die Header-Informationen vorhanden sind, werden der Start-Offset und der End-Offset analysiert, dann wird die Funktion fseek verwendet, um den Dateizeiger zu lokalisieren, und die Funktion fread wird verwendet, um den Dateiinhalt zu lesen und an den Browser auszugeben.
5. Fazit
Es ist nicht schwierig, die Datei-Download-Funktion in PHP zu implementieren. Wir müssen nur prüfen, ob die Datei vorhanden ist, und die korrekten HTTP-Header-Informationen festlegen. Durch die Verwendung von HTTP 1.1-Range-Header-Informationen können segmentierte Downloads problemlos erreicht werden, und das Verhindern von Dateidownloads über gestohlene Links kann die Sicherheit von Dateien schützen. Daher können wir die erforderlichen Funktionen entsprechend unseren Anforderungen implementieren, um eine bessere Benutzererfahrung zu erzielen.
Das obige ist der detaillierte Inhalt vonDatei in PHP herunterladen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!