큰 파일 업로드를 처리 할 때 청크 업로드는 전체 파일을 완전히 업로드 할 때까지 기다리지 않고 파일을 하나씩 업로드 할 수 있도록 파일을 작은 청크로 나눌 수있는 일반적인 기술입니다. 동시에, 전송 프로세스 중에 업로드 된 파일이 변조되지 않도록하기 위해 해시 알고리즘은 일반적으로 파일의 무결성을 확인하는 데 사용됩니다. PHP는 HASH_UPDATE_STREAM 함수를 제공하므로 세그먼트 된 해시 업로드를 구현할 수 있습니다. 이 기사는 Hash_update_stream 함수를 사용 하여이 기능을 구현하는 방법을 자세히 소개합니다.
Hash_update_stream 함수는 PHP의 해시 함수이며 스트림 (예 : 파일, 데이터 스트림 등)을 해시하는 데 사용됩니다. 세그먼트 업로드 시나리오에서 파일 블록이 업로드 될 때마다 해시 값을 업데이트하기 위해이 기능을 호출하여 각 파일 블록이 해시를 올바르게 계산하고 무결성 확인을 수행 할 수 있도록 할 수 있습니다.
기능 프로토 타입 :
bool hash_update_stream ( resource $context , resource $handle [, int $length = 8192 ] )
$ 컨텍스트 : 일반적으로 hash_init 함수를 통해 생성 된 해시 컨텍스트를 지정합니다.
$ 핸들 : 열린 파일 또는 데이터 스트림을 가리키는 리소스.
$ 길이 : 읽는 바이트 수, 기본값은 8192 바이트입니다.
세그먼트에 업로드 해야하는 더 큰 파일이 있다고 가정하고 업로드 된 각 파일 블록에는 해시 확인이 필요합니다. 세그먼트 된 해시 업로드를 다음과 같이 구현할 수 있습니다.
먼저 해시 컨텍스트를 작성하고 계산을 위해 해시 알고리즘 (예 : SHA256 )을 선택하십시오.
$hashContext = hash_init('sha256');
다음으로 파일 스트림을 열고 파일의 내용을 세그먼트로 업로드합니다. 파일 블록이 업로드 될 때마다 해시 값을 업데이트하기 위해 hash_update_stream 함수를 호출합니다.
$filePath = 'path/to/largefile.zip'; // 파일 경로
$chunkSize = 8192; // 읽기 당 블록 크기
$fileHandle = fopen($filePath, 'rb'); // 파일 스트림을 엽니 다
if (!$fileHandle) {
die('파일을 열 수 없습니다');
}
while (!feof($fileHandle)) {
// 파일 스트림에서 블록을 읽으십시오
$chunk = fread($fileHandle, $chunkSize);
// 해시 값을 업데이트하십시오
hash_update_stream($hashContext, $chunk);
// 여기에서 파일 블록을 업로드하십시오
// 각 블록을 업로드 할 업로드 기능이 있다고 가정합니다.
// upload_chunk($chunk);
}
// 파일 스트림을 닫습니다
fclose($fileHandle);
파일의 모든 블록이 업로드 및 처리 된 후 Hash_Final 함수를 사용하여 최종 해시 값을 얻을 수 있습니다.
$finalHash = hash_final($hashContext);
echo "파일의 해시 값은입니다:$finalHash";
이렇게하면 각 파일 블록이 올바르게 해시되어 있는지 확인하고 마지막으로 전체 파일의 해시 값을 얻을 수 있습니다.
세그먼트 업로드 프로세스 중에 클라이언트가 파일 블록을 업로드 할 때마다 해당 해시 값 (또는 전체 파일의 해시 값)을 서버로 보낼 수 있으며 서버는 수신 된 해시 값을 통해 파일의 무결성을 확인합니다.
서버 측 확인 프로세스는 다음과 같습니다.
// 클라이언트가 업로드 한 해시 값이 수신되었다고 가정합니다.
$receivedHash = $_POST['file_hash'];
// 서버 측에서 해시를 다시 계산하십시오
$serverHashContext = hash_init('sha256');
$fileHandle = fopen('path/to/uploaded_chunk', 'rb'); // 업로드 된 파일 블록을 엽니 다
while (!feof($fileHandle)) {
$chunk = fread($fileHandle, 8192);
hash_update_stream($serverHashContext, $chunk);
}
$calculatedHash = hash_final($serverHashContext);
// 해시 값을 확인하십시오
if ($calculatedHash === $receivedHash) {
echo '파일 블록 해시 확인이 전달되었습니다';
} else {
echo '파일 블록 해시 확인에 실패했습니다';
}
fclose($fileHandle);
Hash_update_stream 함수를 사용하여 세그먼트 된 해시 업로드를 구현하는 것은 간단하고 효과적인 방법으로 업로드 프로세스 중에 각 파일 블록의 무결성을 보장 할 수 있습니다. 위의 단계를 통해 파일을 세그먼트에 업로드하고 해시 값 확인을 사용하여 업로드 된 데이터가 조작되지 않았는지 확인할 수 있습니다. 업로드 프로세스 중에 파일의 각 블록을 올바른 순서로 업로드 할 수 있도록 서버는 해당 해시 확인을 수행해야합니다.
위는 Hash_update_stream 함수를 사용하여 세그먼트 된 해시 업로드를 구현하는 기본 방법입니다. 이 기사가 도움이되기를 바랍니다.