Position actuelle: Accueil> Derniers articles> Tutoriel complet sur le téléchargement de l'interruption des fichiers par PHP avec des fichiers volumineux

Tutoriel complet sur le téléchargement de l'interruption des fichiers par PHP avec des fichiers volumineux

gitbox 2025-07-15

Le défi de télécharger un fichier PHP super grand

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.

Quel est le téléchargement de la transmission continue de point d'arrêt

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.

Étapes pour implémenter la transmission continue de point d'arrêt

Obtenez le chemin du fichier et le nom

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);

Définissez l'en-tête de réponse HTTP pour prendre en charge la transmission continue de point d'arrêt

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);
}

Boucle des données de fichier et de sortie

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();
}

Résumer

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.