2017-08-29 54 views
0

下面是提供的手冊上的代碼:確定的文件哈希值與Zend使用前驗證MD5

// Does file have the given hash? 
$validator = new \Zend\Validator\File\Md5('3b3652f336522365223'); 

我不太瞭解如何使用這個作爲我Zend Form中的文件驗證。當文件尚未上傳時,如何預填充散列?

回答

1

你不知道。散列驗證器確保上傳的文件具有提供的散列。即您已經知道該文件的散列(文件已被上傳,您從第三方獲取散列,或者文件的預期散列已包含在請求中),並且要驗證上傳的文件具有相同的散列。

例如參見How to calculate the MD5 hash of a file using javascript以瞭解如何提供期望的MD5散列以及上傳的文件以驗證文件是否已正確上傳。

問題就變成了你要解決的問題 - 如果請求在文件上傳時被中止,大多數服務器將取消請求(所以不完整的文件通常不會傳遞到您的代碼中) 。

1

A \Zend\Validator\File\Md5,一般來說,在網絡表單中不會很有用。

用戶必須在單獨的字段上提供MD5哈希,或者必須在提交表單之前通過JavaScript動態計算它。在任何一種情況下,都不能真正用於「驗證」文件,因爲要麼依賴文件來提供驗證散列,並且驗證上傳完成是沒有用的(如果上載失敗,請求將會是中止,你不會訪問不完整的文件)。

您可能可以使用它來驗證某種服務器啓動的下載。例如。在您的代碼中的某處您已經下載了一個文件,並且在某個地方可以訪問您要下載的文件的散列值:然後您可以使用\Zend\Validator\File\Md5來驗證真實性/完整性。

例如爲:

$file_path = '/downloads/file.tgz'; 
$fp = fopen ($file_path, 'w'); 
$url = "http://remotehost/file.tgz"; 

$ch = curl_init($url); 

curl_setopt($ch, CURLOPT_TIMEOUT, 50); 
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

$data = curl_exec($ch); 
curl_close($ch); 

// either you get the hash with a different request, or you've somehow obtained the hash previously 
$validator = new \Zend\Validator\File\Md5($hash); 

if (! $validator->isValid($file_path)) { 
// file isn't valid, do something about it 

}