Pendant le transfert de fichiers ou le téléchargement, en particulier les fichiers volumineux, les interruptions sont souvent rencontrées. Pour garantir l'intégrité des fichiers, les fichiers sont généralement hachés et vérifiés pendant le transfert de fichiers. PHP fournit une fonction de hachage puissante, et la fonction hash_update_stream en fait partie. Il peut être utilisé pour gérer les calculs de hachage de fichiers volumineux, en particulier adaptés à la vérification des fichiers continus de point d'arrêt.
Cet article présentera comment utiliser hash_update_stream pour implémenter la vérification d'intégrité du hachage des fichiers pour s'assurer que les fichiers peuvent être une vérification de l'intégrité lorsqu'ils continuent de télécharger après l'interruption.
La fonction hash_update_stream est une fonction de PHP qui calcule les valeurs de hachage pendant le processus de lecture des données du flux. Contrairement à Hash_update , ce dernier exige que les données entières soient chargées en mémoire à la fois, tandis que Hash_update_stream peut progressivement lire le flux de fichiers pour les calculs de hachage, il convient donc particulièrement pour les fichiers volumineux ou les fichiers qui doivent être traités en morceaux.
bool hash_update_stream ( resource $context , resource $stream [, int $length ] )
$ Context : Hash Resource, généralement créé par hash_init .
$ Stream : File Stream Resource, généralement obtenu via fopen () .
$ Longueur : Nombre d'octets à lire, la valeur par défaut est 8192 octets.
Pendant le transfert de fichiers, si la transmission est déconnectée à mi-chemin, le mécanisme de transfert de point d'arrêt continuera de télécharger à partir de la position déconnectée. Afin de vérifier l'intégrité du fichier une fois le point d'arrêt transmis en continu, la valeur de hachage du fichier est généralement calculée du côté serveur et comparée à la valeur de hachage transmise par le client.
Supposons que vous ayez un point d'arrêt pour continuer à télécharger le fichier bigfile.zip , vous devez vérifier que le fichier a été falsifié ou perdu une partie du contenu pendant le processus de transmission. Voici les étapes pour mettre en œuvre la vérification de l'intégrité du hachage.
Supposons que nous devons télécharger un fichier bigfile.zip et vérifier l'intégrité du fichier lorsqu'il est transféré au point d'arrêt. Le code suivant montre comment calculer le hachage d'un fichier à l'aide de la fonction hash_update_stream lors de la continuation de point d'arrêt.
<?php
// Contexte de hachage initial(utiliser SHA256 algorithme)
$hashContext = hash_init('sha256');
// Ouvrez le flux de fichiers
$fileStream = fopen('https://m66.net/bigfile.zip', 'rb');
if (!$fileStream) {
die("Impossible d'ouvrir le fichier!\n");
}
// Calculez la valeur de hachage du fichier
while (!feof($fileStream)) {
// Lisez le fichier et mettez à jour le hachage
$data = fread($fileStream, 8192);
hash_update_stream($hashContext, $data);
}
// Obtenez la valeur de hachage finale
$fileHash = hash_final($hashContext);
// La valeur de hachage du fichier de sortie
echo "DéposéSHA-256Valeur de hachage:$fileHash\n";
// Fermez le flux de fichiers
fclose($fileStream);
// 假设已经在服务器端生成并存储了Déposé正确Valeur de hachage
$serverStoredHash = 'abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';
// 比较本地计算的Valeur de hachage与服务器存储的Valeur de hachage
if ($fileHash === $serverStoredHash) {
echo "La vérification de l'intégrité du fichier a réussi!\n";
} else {
echo "La vérification du fichier a échoué,Le fichier peut avoir été corrompu ou falsifié!\n";
}
?>
hash_init : initialisez un contexte de hachage et sélectionnez l'algorithme SHA256 pour générer la valeur de hachage.
FOPEN : Ouvrez le flux de fichiers à télécharger, nous utilisons ici https://m66.net/bigfile.zip comme exemple d'adresse de fichier.
hash_update_stream : lit progressivement chaque élément de données dans le fichier et met à jour la valeur de hachage. La taille du bloc de données lue par temps est de 8192 octets.
hash_final : obtient la valeur de hachage finale du fichier.
Vérification du fichier : comparaison de la valeur de hachage calculée avec la valeur de hachage correcte stockée sur le serveur pour vérifier l'intégrité du fichier.
Dans un scénario où les points d'arrêt se poursuivent, nous stockons généralement une valeur de hachage "partie téléchargée", puis calculons le hachage de la partie de fichier commençant par le dernier point d'arrêt alors que nous continuons à télécharger. Pour ce faire, Fread dans le code peut être utilisé avec Fseek pour contrôler la position de lecture du fichier, garantissant ainsi que le calcul commence à partir de la position spécifiée.
// Définissez le pointeur de flux de fichiers sur l'emplacement spécifié(Par exemple, la partie où se poursuit le point d'arrêt)
fseek($fileStream, $resumePosition);
Alors que nous continuons à télécharger, nous continuons à lire les blocs de données à partir de l'emplacement de reprise et à mettre à jour le hachage, vérifiant enfin l'intégrité de l'ensemble du fichier.
En utilisant hash_update_stream , PHP fournit un moyen efficace de calculer la valeur de hachage des fichiers volumineux, en particulier lors du transfert de fichiers avec une transmission continue de point d'arrêt. De cette façon, nous pouvons assurer l'intégrité et l'exactitude du fichier pendant le processus de transfert et éviter la perte ou la corruption des données après la déconnexion du fichier au milieu.
Si vous développez un système de téléchargement ou de téléchargement de fichiers qui doit prendre en charge la transmission continue de point d'arrêt, combiné avec la fonction hash_update_stream pour la vérification du hachage, il vous fournira une garantie d'intégrité des données fiable.