Maison  >  Article  >  développement back-end  >  Télécharger le fichier en PHP

Télécharger le fichier en PHP

王林
王林original
2023-05-24 09:11:105922parcourir

Lors du développement d'un site Web ou d'une application, nous devons souvent implémenter la fonction de téléchargement de fichiers, qui peut être facilement implémentée via PHP. Cet article explique comment utiliser PHP pour implémenter la fonction de téléchargement de fichiers.

1. Processus de téléchargement du fichier

Avant de télécharger le fichier, nous devons comprendre le processus de téléchargement :

  1. Les utilisateurs sont sur le page Web ou cliquez sur le bouton de téléchargement de l'application ;
  2. Le serveur accepte la demande de téléchargement
  3. Le serveur vérifie les autorisations des utilisateurs et l'existence du fichier ; #Le serveur envoie le fichier à l'utilisateur ;
  4. l'utilisateur reçoit le fichier et l'enregistre.
  5. 2. Préparez-vous à télécharger le fichier

En PHP, nous pouvons utiliser la fonction readfile pour lire le contenu du fichier et l'afficher dans le navigateur. Cependant, nous devons nous assurer que le fichier existe, sinon une exception sera levée. Voici un exemple de code simple :

$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.');
}

Dans le code ci-dessus, nous utilisons d'abord la fonction file_exists pour vérifier si le fichier existe. Si le fichier existe, définissez le fichier d'en-tête HTTP pour indiquer au navigateur que. un fichier est sur le point d'être téléchargé, et spécifiez le nom du fichier dans Content-Disposition, spécifiez le type de fichier dans Content-Type et utilisez la fonction readfile pour afficher le contenu du fichier.

3. Empêcher les téléchargements de fichiers à partir de liens volés

En raison de la nature du navigateur, certains sites malveillants peuvent voler vos fichiers, nous devons donc empêcher le vol des téléchargements de fichiers. chaîne.

Nous pouvons ajouter le code suivant pour empêcher le vol des téléchargements de fichiers :

$referer = $_SERVER['HTTP_REFERER'];
if ($referer && !preg_match('/^https?://' . $_SERVER['SERVER_NAME'] . '/', $referer))
{
    header("HTTP/1.1 403 Forbidden");
    die("Access denied.");
}

Ce code vérifiera les informations d'en-tête HTTP_REFERER et s'assurera qu'il correspond au nom de domaine de l'utilisateur actuel. serveur, s'il ne correspond pas, alors un code d'état 403 est renvoyé et l'accès est interdit.

4. Implémentez le téléchargement segmenté

Lors du téléchargement de fichiers plus volumineux, vous devrez peut-être implémenter la fonction de téléchargement segmenté pour accélérer la vitesse de téléchargement et réduire l'utilisation de la bande passante du réseau. Avec l'aide des informations d'en-tête Range de HTTP 1.1, nous pouvons facilement implémenter des téléchargements segmentés.

Ce qui suit est un exemple de code :

$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.');
}

Dans le code ci-dessus, nous vérifions d'abord les informations d'en-tête HTTP_RANGE, et si les informations d'en-tête n'existent pas, générons l'intégralité du fichier . Si les informations d'en-tête existent, le décalage de début et le décalage de fin sont analysés, puis la fonction fseek est utilisée pour localiser le pointeur de fichier et la fonction fread est utilisée pour lire le contenu du fichier et l'afficher dans le navigateur.

5. Conclusion

Il n'est pas difficile d'implémenter la fonction de téléchargement de fichier en PHP. Il suffit de vérifier si le fichier existe et de définir les informations d'en-tête HTTP correctes. L'utilisation des informations d'en-tête HTTP 1.1 Range peut facilement réaliser des téléchargements segmentés, et empêcher les téléchargements de fichiers à partir de liens volés peut protéger la sécurité des fichiers. Par conséquent, nous pouvons choisir d’implémenter les fonctions requises en fonction de nos besoins pour obtenir une meilleure expérience utilisateur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Modèle MVC en PHPArticle suivant:Modèle MVC en PHP