Pendant le processus de développement, lors de la rencontre de la nécessité de télécharger des fichiers volumineux, il est simple d'utiliser la fonction ReadFile () de PHP, mais pour les fichiers super grands, la lecture directement de la sortie du fichier entraînera une utilisation excessive de mémoire ou même un débordement. Par conséquent, il est nécessaire d'adopter une solution de téléchargement plus efficace pour assurer la stabilité du programme et l'expérience utilisateur.
La continuation des points d'arrêt permet aux utilisateurs de continuer à télécharger à partir de l'emplacement de l'interruption après l'interruption du téléchargement, sans télécharger à plusieurs reprises des pièces terminées. Cela n'économise pas seulement la bande passante, mais améliore également la fiabilité du téléchargement et la satisfaction des utilisateurs, en particulier lorsque l'environnement réseau est instable.
Tout d'abord, utilisez $ _get pour obtenir les paramètres de chemin de fichier transmis par le client et utilisez la fonction Basename () pour extraire le nom de fichier pour éviter les risques de sécurité tels que le passage de répertoire.
$file = $_GET['file'];
$filename = basename($file);
Dites au navigateur qu'il s'agit d'un flux de fichiers binaire en définissant le type de contenu en application / trace d'octet . Définissez également l'en-tête de contenu pour indiquer le téléchargement de la pièce jointe et le nom du fichier.
Selon HTTP_RANGE dans l'en-tête de demande, l'emplacement de démarrage de téléchargement est analysé et le pointeur de fichier est ajusté à l'aide de fseek () pour obtenir une transmission continue de point d'arrêt.
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);
}
En parcourant le contenu du fichier, lisez un tampon d'une certaine taille (par exemple, 4096 octets) à chaque fois, le publiez progressivement vers le navigateur et actualisez le tampon de sortie pour garantir la transmission en temps opportun des données.
$buffer_size = 4096;
while (!feof($file)) {
echo fread($file, $buffer_size);
ob_flush();
flush();
}
Grâce à la méthode ci-dessus, PHP peut soutenir efficacement l'interruption des points d'arrêt des fichiers super-grands, en résolvant les lacunes de la fonction ReadFile () traditionnelle dans le traitement des fichiers larges. Les développeurs peuvent également mettre en œuvre l'écran de progression du téléchargement, le contrôle de la limite de vitesse et d'autres fonctions en fonction de cela pour améliorer davantage l'expérience utilisateur.
L'utilisation rationnelle de l'en-tête de plage et des fonctions de fonctionnement des fichiers PHP du protocole HTTP peut rendre le service de téléchargement plus stable et flexible, adapté à divers scénarios commerciaux pratiques.