【发布时间】:2016-04-11 15:08:09
【问题描述】:
我有一些下载大文件的 cURL 调用。 我想知道是否可以在文件仍在下载时计算哈希?
我认为进度回调函数是实现这一目标的正确位置..
function get($urlget, $filename) {
//Init Stuff[...]
$this->fp = fopen($filename, "w+");
$ch = curl_init();
//[...] irrelevant curlopt stuff
curl_setopt($ch, CURLOPT_FILE, $this->fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_NOPROGRESS, 0);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, array($this,'curl_progress_cb'));
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$ret = curl_exec($ch);
if( curl_errno($ch) ){
$ret = FALSE;
}
curl_close($ch);
fclose($this->fp);
return $ret;
}
function curl_progress_cb($dltotal, $dlnow, $ultotal, $ulnow ){
//... Calculate MD5 of file here with $this->fp
}
【问题讨论】:
-
如果文件还在下载,MD5怎么做完整的hash?除非文件的所有者提供 MD5 哈希,否则我看不出你怎么做。
-
MD5 的唯一要点是,如果您获取文件 from 的地方在您下载文件之前(或可能之后)向您发送了 MD5,以便您可以检查您收到的文件是否与他们传输的文件相同,即文件在传输过程中未更改。您在下载文件时计算 MD5,或者即使在您完全接收到文件时,也没有任何意义。
-
计算 MD5 作为 curl_progress 的一部分意味着计算 MD5 不止一次。这听起来不像会节省你的时间,事实上它听起来会增加你的下载时间。如果事实上它会在收到最后一个缓冲区时生成正确的 MD5