在使用zend validate md5之前确定文件哈希

时间:2017-08-29 19:54:50

标签: php hash zend-framework2 zend-framework3

以下是手册中提供的代码:

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

我不太清楚如何将其用作Zend Form内的文件验证程序。如何在文件尚未上传时预先填充哈希值?

2 个答案:

答案 0 :(得分:1)

你不是。散列验证器用于确保上载的文件具有提供的散列。即您已经知道文件的哈希值(文件已经上传,您已经从第三方获取了哈希值,或者文件的预期哈希值包含在请求中),并且想要验证上传的文件具有相同的哈希值。

请参阅示例How to calculate the MD5 hash of a file using javascript,了解如何提供预期的MD5哈希以及上传的文件,以验证文件是否已正确上传。

然后问题就变成你要解决的问题了 - 如果在上传文件时请求被中止,大多数服务器将取消请求(因此通常不会将不完整的文件传递给您的代码)。

答案 1 :(得分:1)

一般来说,\Zend\Validator\File\Md5在网络表单中不会非常有用。

用户必须在单独的字段上提供MD5哈希,或者您必须在提交表单之前通过javascript动态计算它。在任何一种情况下,您都无法真正使用"验证"该文件,因为您要么依赖该文件来提供验证哈希,并且无法验证上传是否完成(如果上传失败,请求将被中止,您将无法访问不完整的文件)

您可能可以用来验证某种服务器启动的下载。例如。您可以在代码中的某个位置下载文件,然后在某处单独访问您要下载的文件的哈希值:然后您可以使用\Zend\Validator\File\Md5来验证其真实性/完整性。

E.g:

$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

}