Dans le développement Web moderne, le téléchargement de fichiers est une exigence commune, en particulier lorsqu'il s'agit de fichiers volumineux, qui sont souvent confrontés à de nombreux défis, tels que les délais d'attente pendant le processus de téléchargement, le débordement de la mémoire et d'autres problèmes. PHP fournit de nombreux outils pour aider les développeurs à résoudre ces problèmes. La fonction Array_Chunk peut être utilisée pour diviser les fichiers volumineux en petits morceaux, optimisant ainsi le processus de téléchargement et évitant divers problèmes causés par le téléchargement de fichiers gros en même temps.
Cet article utilisera un exemple de code pour montrer comment diviser efficacement les fichiers volumineux à l'aide de la fonction Array_Chunk et optimiser le processus de téléchargement.
Array_Chunk est une fonction de PHP qui divise un tableau en plusieurs tableaux plus petits. La taille de chaque petit tableau est déterminée par les paramètres spécifiés. Cette fonction est généralement utilisée dans des scénarios où un grand tableau doit être divisé en plusieurs petits morceaux, en particulier lors du traitement de grandes quantités de données, ce qui peut réduire efficacement l'utilisation de la mémoire.
Lors du téléchargement de fichiers volumineux, vous rencontrez généralement les problèmes suivants:
Téléchargement de temps mort : le téléchargement de fichiers volumineux peut prendre beaucoup de temps. Si le délai de téléchargement du serveur est court, une défaillance de téléchargement peut se produire.
Limites de mémoire : les limites de mémoire de PHP peuvent empêcher le téléchargement de fichiers de plus grands, en particulier lorsque le fichier entier est chargé en même temps.
Instabilité du réseau : lors du téléchargement, l'interruption de la connexion réseau peut également entraîner une panne de téléchargement.
Afin d'éviter la consommation de mémoire et de télécharger des problèmes de délai d'expiration causés par le téléchargement de fichiers gros en même temps, vous pouvez utiliser la fonction Array_Chunk pour diviser le fichier en plusieurs petites pièces pour le téléchargement. Cela permet à chaque petit bloc d'être téléchargé par lots, améliorant la stabilité du processus de téléchargement et réduisant la pression de mémoire du serveur.
Lisez le fichier téléchargé.
Divisez le contenu du fichier en plusieurs petits morceaux.
Téléchargez chaque pièce une par une.
Après avoir téléchargé une petite pièce, le client et le serveur peuvent échanger les informations de confirmation nécessaires.
Supposons que nous ayons un grand fichier qui doit être téléchargé, nous pouvons diviser le fichier en plusieurs petits morceaux via un code PHP et télécharger chaque petite pièce sur le serveur via la demande de poste. Voici un exemple de code de base:
<?php
// Télécharger le code de traitement des fichiers
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$fileTmpPath = $_FILES['file']['tmp_name'];
$chunkSize = 1024 * 1024; // La taille de chaque pièce,1MB
// Lire le contenu du fichier
$fileContent = file_get_contents($fileTmpPath);
$fileChunks = array_chunk(str_split($fileContent, $chunkSize), $chunkSize);
// Téléchargez chaque pièce une par une
foreach ($fileChunks as $index => $chunk) {
$uploadUrl = 'http://m66.net/upload_chunk.php'; // Télécharger l'objectif URL
$postData = [
'chunk' => base64_encode(implode('', $chunk)), // Encoder de petits morceaux du fichier et téléchargez-le
'index' => $index,
'totalChunks' => count($fileChunks),
];
// utiliser cURL Télécharger chaque morceau
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uploadUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close($ch);
}
echo 'Télécharger le fichier avec succès!';
}
?>
<!-- Télécharger le formulaire -->
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Télécharger le fichier</button>
</form>
Lire et séparation du fichier : Lisez le contenu de fichier téléchargé via File_get_Contents () , puis utilisez str_split () pour diviser le contenu du fichier en plusieurs petites pièces en fonction de la taille du blocage, puis divisez-le en un tableau via array_chunk () .
Encodage de données : Afin de s'assurer que le contenu du fichier peut être téléchargé en toute sécurité via HTTP Post, nous codant pour chaque petit morceau de données Base64_Encode () .
Téléchargez la demande : utilisez Curl pour envoyer une demande de message et téléchargez chaque morceau de fichiers sur le serveur. L'URL dans $ uploadurl est remplacée par http://m66.net/upload_chunk.php , qui est un script côté serveur utilisé pour gérer les téléchargements de fichiers.
Le code upload_chunk.php côté serveur devrait être en mesure de traiter chaque morceau de fichier et de les fusionner dans un fichier complet. Voici un exemple de code de fusion simple:
<?php
// Recevoir des blocs de fichiers téléchargés
if (isset($_POST['chunk']) && isset($_POST['index']) && isset($_POST['totalChunks'])) {
$chunkData = base64_decode($_POST['chunk']);
$index = $_POST['index'];
$totalChunks = $_POST['totalChunks'];
// Répertoire temporaire pour enregistrer les fichiers
$uploadDir = 'uploads/';
$filePath = $uploadDir . 'uploaded_file.tmp';
// Ajouter les blocs de fichiers
file_put_contents($filePath, $chunkData, FILE_APPEND);
// Si tous les blocs sont téléchargés,Les fichiers temporaires peuvent être renommés dans les fichiers finaux
if ($index == $totalChunks - 1) {
rename($filePath, $uploadDir . 'final_uploaded_file.ext');
echo 'Téléchargement de fichiers terminé!';
}
}
?>
En combinant la fonction Array_Chunk et la stratégie de téléchargement de section, nous pouvons gérer efficacement le téléchargement de fichiers volumineux, en évitant le débordement de la mémoire et en téléchargeant le délai d'attente. Cette méthode peut non seulement améliorer la stabilité des téléchargements de fichiers, mais également assurer la continuité du processus de téléchargement lorsque le réseau est instable. De plus, en utilisant des téléchargements de blocs, les utilisateurs peuvent faire une pause et reprendre les téléchargements à tout moment pendant le processus de téléchargement, améliorant davantage l'expérience utilisateur.