etag php,Etag.php

namespace dd;

const SDK_VER = '7.1.2';

const BLOCK_SIZE = 4194304; //4*1024*1024 分块上传块大小,该参数为接口规格,不能修改

const RS_HOST = 'http://rs.qbox.me'; // 文件元信息管理操作Host

const RSF_HOST = 'http://rsf.qbox.me'; // 列举操作Host

const API_HOST = 'http://api.qiniu.com'; // 数据处理操作Host

const UC_HOST = 'http://uc.qbox.me'; // Host

class Etag

{

private static function packArray($v, $a)

{

return call_user_func_array('pack', array_merge(array($v), (array)$a));

}

private static function blockCount($fsize)

{

return intval(($fsize + (BLOCK_SIZE - 1)) / BLOCK_SIZE);

}

private static function calcSha1($data)

{

$sha1Str = sha1($data, true);

$err = error_get_last();

if ($err !== null) {

return array(null, $err);

}

$byteArray = unpack('C*', $sha1Str);

return array($byteArray, null);

}

public static function sum($filename)

{

$fhandler = fopen($filename, 'r');

$err = error_get_last();

if ($err !== null) {

return array(null, $err);

}

$fstat = fstat($fhandler);

$fsize = $fstat['size'];

if ((int)$fsize === 0) {

fclose($fhandler);

return array('Fto5o-5ea0sNMlW_75VgGJCv2AcJ', null);

}

$blockCnt = self::blockCount($fsize);

$sha1Buf = array();

if ($blockCnt <= 1) {

array_push($sha1Buf, 0x16);

$fdata = fread($fhandler, BLOCK_SIZE);

if ($err !== null) {

fclose($fhandler);

return array(null, $err);

}

list($sha1Code,) = self::calcSha1($fdata);

$sha1Buf = array_merge($sha1Buf, $sha1Code);

} else {

array_push($sha1Buf, 0x96);

$sha1BlockBuf = array();

for ($i = 0; $i < $blockCnt; $i++) {

$fdata = fread($fhandler, BLOCK_SIZE);

list($sha1Code, $err) = self::calcSha1($fdata);

if ($err !== null) {

fclose($fhandler);

return array(null, $err);

}

$sha1BlockBuf = array_merge($sha1BlockBuf, $sha1Code);

}

$tmpData = self::packArray('C*', $sha1BlockBuf);

list($sha1Final,) = self::calcSha1($tmpData);

$sha1Buf = array_merge($sha1Buf, $sha1Final);

}

$etag = self::base64_urlSafeEncode(self::packArray('C*', $sha1Buf));

return array($etag, null);

}

/**

* 对提供的数据进行urlsafe的base64编码。

*

* @param string $data 待编码的数据,一般为字符串

*

* @return string 编码后的字符串

* @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64

*/

public static function base64_urlSafeEncode($data)

{

$find = array('+', '/');

$replace = array('-', '_');

return str_replace($find, $replace, base64_encode($data));

}

/**

* 对提供的urlsafe的base64编码的数据进行解码

*

* @param string $str 待解码的数据,一般为字符串

*

* @return string 解码后的字符串

*/

public function base64_urlSafeDecode($str)

{

$find = array('-', '_');

$replace = array('+', '/');

return base64_decode(str_replace($find, $replace, $str));

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值