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 :
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!