Beim Umgang mit großer Dateien -Uploads ist das Chunked -Upload eine gemeinsame Technik, mit der Dateien in kleinere Brocken aufgeteilt werden können, um einzeln zu hochladen, ohne darauf zu warten, dass die gesamte Datei vollständig hochgeladen wird. Um sicherzustellen, dass die hochgeladene Datei während des Übertragungsprozesses nicht manipuliert wird, wird ein Hash -Algorithmus normalerweise verwendet, um die Integrität der Datei zu überprüfen. PHP bietet eine Funktion von Hash_Update_Stream , mit der wir segmentierte Hash -Upload implementieren können. In diesem Artikel wird ausführlich eingeführt, wie die Funktion hash_update_stream verwendet wird, um diese Funktion zu implementieren.
Die Funktion von Hash_Update_Stream ist eine Hash -Funktion in PHP, mit der ein Stream (z. B. eine Datei, ein Datenstrom usw.) Hash -Stream verwendet wird. In einem segmentierten Upload -Szenario kann jedes Mal, wenn ein Dateiblock hochgeladen wird, diese Funktion aufgerufen werden, um den Hash -Wert zu aktualisieren, um sicherzustellen, dass jeder Dateiblock die Hash -Hash korrekt berechnen und die Integritätsüberprüfung durchführen kann.
Funktionsprototyp:
bool hash_update_stream ( resource $context , resource $handle [, int $length = 8192 ] )
$ context : Gibt einen Hash -Kontext an, der normalerweise durch die Hash_init -Funktion erstellt wurde.
$ Handle : Eine Ressource, die auf einen geöffneten Datei oder einen Datenstrom hinweist.
$ Länge : Die Anzahl der gelesenen Bytes, der Standardwert beträgt 8192 Bytes.
Angenommen, wir haben eine größere Datei, die in Segmenten hochgeladen werden muss, und jeder hochgeladene Dateiblock benötigt die Hash -Überprüfung. Wir können segmentierte Hash -Upload wie folgt implementieren:
Erstellen Sie zunächst einen Hash -Kontext und wählen Sie einen Hash -Algorithmus (wie SHA256 ) zur Berechnung aus.
$hashContext = hash_init('sha256');
Als nächstes öffnen wir den Dateistrom und laden den Inhalt der Datei in Segmenten hoch. Jedes Mal, wenn ein Dateiblock hochgeladen wird, rufen wir die Funktion von Hash_Update_Stream auf, um den Hash -Wert zu aktualisieren.
$filePath = 'path/to/largefile.zip'; // Dateipfad
$chunkSize = 8192; // Blockgröße pro Lesen
$fileHandle = fopen($filePath, 'rb'); // Öffnen Sie den Dateistrom
if (!$fileHandle) {
die('Die Datei kann nicht geöffnet werden');
}
while (!feof($fileHandle)) {
// Lesen Sie einen Block von einem Dateistrom aus
$chunk = fread($fileHandle, $chunkSize);
// Hash -Wert aktualisieren
hash_update_stream($hashContext, $chunk);
// Dateiblöcke hier hochladen
// Angenommen, Sie haben eine Upload -Funktion zum Hochladen jedes Blocks
// upload_chunk($chunk);
}
// Schließen Sie den Dateistrom
fclose($fileHandle);
Nachdem alle Blöcke der Datei hochgeladen und verarbeitet wurden, können wir die Funktion von Hash_Final verwenden, um den endgültigen Hash -Wert zu erhalten.
$finalHash = hash_final($hashContext);
echo "Der Hash -Wert der Datei ist:$finalHash";
Auf diese Weise können wir sicherstellen, dass jeder Dateiblock korrekt gehasht ist und schließlich den Hash -Wert der gesamten Datei erhalten.
Während des segmentierten Upload -Prozesses kann der Client einen Dateiblock hochladen, und kann den entsprechenden Hash -Wert (oder den Hash -Wert der gesamten Datei) an den Server senden, und der Server überprüft die Integrität der Datei über den empfangenen Hash -Wert.
Der serverseitige Überprüfungsprozess ist wie folgt:
// Angenommen, der vom Client hochgeladene Hash -Wert wird empfangen
$receivedHash = $_POST['file_hash'];
// Berechnen Sie den Hash auf der Serverseite neu
$serverHashContext = hash_init('sha256');
$fileHandle = fopen('path/to/uploaded_chunk', 'rb'); // Öffnen Sie den hochgeladenen Dateiblock
while (!feof($fileHandle)) {
$chunk = fread($fileHandle, 8192);
hash_update_stream($serverHashContext, $chunk);
}
$calculatedHash = hash_final($serverHashContext);
// Hash -Wert überprüfen
if ($calculatedHash === $receivedHash) {
echo 'Dateiblock -Hash -Überprüfung bestanden';
} else {
echo 'Dateiblock -Hash -Überprüfung ist fehlgeschlagen';
}
fclose($fileHandle);
Die Verwendung der Funktion Hash_Update_Stream zum Implementieren segmentierter Hash -Uploads ist eine einfache und effektive Art und Weise, die die Integrität jedes Dateiblocks während des Upload -Prozesses sicherstellen kann. In den obigen Schritten können wir die Datei in Segmenten hochladen und die Hash -Wert -Überprüfung verwenden, um sicherzustellen, dass die hochgeladenen Daten nicht manipuliert wurden. Es ist zu beachten, dass während des Upload -Prozesses, um sicherzustellen, dass jeder Block der Datei in der richtigen Reihenfolge hochgeladen werden kann, der Server auch die entsprechende Hash -Überprüfung durchführen muss.
Das obige ist die grundlegende Methode zur Verwendung der Funktion Hash_Update_Stream , um segmentierte Hash -Uploads zu implementieren. Ich hoffe, dieser Artikel wird Ihnen hilfreich sein!