<?php
namespace qiniu;
define('BLOCK_BITS', 22);
define('BLOCK_SIZE', 1 << BLOCK_BITS);
class Qetag
{
public function BlockCount($fsize) {
return (($fsize + (BLOCK_SIZE - 1)) >> BLOCK_BITS);
}
public function CalSha1($fhandler) {
$fdata = fread($fhandler, BLOCK_SIZE);
$sha1Str = sha1($fdata, true);
$err = error_get_last();
if ($err != null) {
return array(null, $err);
}
$byteArray = unpack('C*', $sha1Str);
return array($byteArray, null);
}
public function URLSafeBase64Encode($str) // URLSafeBase64Encode
{
$find = array('+', '/');
$replace = array('-', '_');
return str_replace($find, $replace, base64_encode($str));
}
public function PackArray($v, $a) {
return call_user_func_array('pack', array_merge(array($v),(array)$a));
}
function GetEtag($filename) {
if (!is_file($filename)) {
$err = array ('message' => 'Can not open ' . $filename . ' as a file.');
return array(null, $err);
}
$fhandler = fopen($filename, 'r');
$err = error_get_last();
if ($err != null) {
return array(null, $err);
}
$fstat = fstat($fhandler);
$fsize = $fstat['size'];
$blockCnt = $this->BlockCount($fsize);
$sha1Buf = array();
if ($blockCnt <= 1) {
$sha1Buf[] = 0x16;
list($sha1Code, $err) = $this->CalSha1($fhandler);
if ($err != null) {
return array(null, $err);
}
fclose($fhandler);
$sha1Buf = array_merge($sha1Buf, $sha1Code);
} else {
$sha1Buf[] = 0x96;
$sha1BlockBuf = array();
for ($i=0; $i < $blockCnt; $i++) {
list($sha1Code, $err) = $this->CalSha1($fhandler);
if ($err != null) {
return array(null, $err);
}
$sha1BlockBuf = array_merge($sha1BlockBuf, $sha1Code);
}
$tmpData = $this->PackArray('C*', $sha1BlockBuf);
$tmpFhandler = tmpfile();
fwrite($tmpFhandler, $tmpData);
fseek($tmpFhandler, 0);
list($sha1Final, $_err) = $this->CalSha1($tmpFhandler);
$sha1Buf = array_merge($sha1Buf, $sha1Final);
}
$etag = $this->URLSafeBase64Encode($this->PackArray('C*', $sha1Buf));
return array($etag, null);
}
}
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。