Heim  >  Artikel  >  Backend-Entwicklung  >  Datei in PHP herunterladen

Datei in PHP herunterladen

王林
王林Original
2023-05-24 09:11:105848Durchsuche

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:

  1. Benutzer sind auf der Webseite oder Klicken Sie auf die Download-Schaltfläche in der Anwendung;
  2. Der Server akzeptiert die Download-Anfrage; #Der Server sendet die Datei an den Benutzer;
  3. Der Benutzer empfängt die Datei und speichert sie.
  4. 2. Bereiten Sie den Download der Datei vor
  5. In PHP können wir die Funktion readfile verwenden, um den Dateiinhalt zu lesen und an den Browser auszugeben. Wir müssen jedoch sicherstellen, dass die Datei vorhanden ist, andernfalls wird eine Ausnahme ausgelöst. Das Folgende ist ein einfaches Codebeispiel:
$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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:MVC-Muster in PHPNächster Artikel:MVC-Muster in PHP