123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <?php
- require_once("http.php");
- require_once("auth_digest.php");
- // ----------------------------------------------------------
- // class Qiniu_Rio_PutExtra
- class Qiniu_Rio_PutExtra
- {
- public $Bucket = null; // 必选(未来会没有这个字段)。
- public $Params = null;
- public $MimeType = null;
- public $ChunkSize = 0; // 可选。每次上传的Chunk大小
- public $TryTimes = 3; // 可选。尝试次数
- public $Progresses = null; // 可选。上传进度:[]BlkputRet
- public $Notify = null; // 进度通知:func(blkIdx int, blkSize int, ret *BlkputRet)
- public $NotifyErr = null; // 错误通知:func(blkIdx int, blkSize int, err error)
- public function __construct($bucket = null) {
- $this->Bucket = $bucket;
- }
- }
- // ----------------------------------------------------------
- // func Qiniu_Rio_BlockCount
- define('QINIU_RIO_BLOCK_BITS', 22);
- define('QINIU_RIO_BLOCK_SIZE', 1 << QINIU_RIO_BLOCK_BITS); // 4M
- function Qiniu_Rio_BlockCount($fsize) // => $blockCnt
- {
- return ($fsize + (QINIU_RIO_BLOCK_SIZE - 1)) >> QINIU_RIO_BLOCK_BITS;
- }
- // ----------------------------------------------------------
- // internal func Qiniu_Rio_Mkblock/Mkfile
- function Qiniu_Rio_Mkblock($self, $host, $reader, $size) // => ($blkputRet, $err)
- {
- if (is_resource($reader)) {
- $body = fread($reader, $size);
- if ($body === false) {
- $err = new Qiniu_Error(0, 'fread failed');
- return array(null, $err);
- }
- } else {
- list($body, $err) = $reader->Read($size);
- if ($err !== null) {
- return array(null, $err);
- }
- }
- if (strlen($body) != $size) {
- $err = new Qiniu_Error(0, 'fread failed: unexpected eof');
- return array(null, $err);
- }
- $url = $host . '/mkblk/' . $size;
- return Qiniu_Client_CallWithForm($self, $url, $body, 'application/octet-stream');
- }
- function Qiniu_Rio_Mkfile($self, $host, $key, $fsize, $extra) // => ($putRet, $err)
- {
- $url = $host . '/mkfile/' . $fsize;
- if ($key !== null) {
- $url .= '/key/' . Qiniu_Encode($key);
- }
- if (!empty($extra->MimeType)) {
- $url .= '/mimeType/' . Qiniu_Encode($extra->MimeType);
- }
- if (!empty($extra->Params)) {
- foreach ($extra->Params as $k=>$v) {
- $url .= "/" . $k . "/" . Qiniu_Encode($v);
- }
- }
- $ctxs = array();
- foreach ($extra->Progresses as $prog) {
- $ctxs []= $prog['ctx'];
- }
- $body = implode(',', $ctxs);
- return Qiniu_Client_CallWithForm($self, $url, $body, 'application/octet-stream');
- }
- // ----------------------------------------------------------
- // class Qiniu_Rio_UploadClient
- class Qiniu_Rio_UploadClient
- {
- public $uptoken;
- public function __construct($uptoken)
- {
- $this->uptoken = $uptoken;
- }
- public function RoundTrip($req) // => ($resp, $error)
- {
- $token = $this->uptoken;
- $req->Header['Authorization'] = "UpToken $token";
- return Qiniu_Client_do($req);
- }
- }
- // ----------------------------------------------------------
- // class Qiniu_Rio_Put/PutFile
- function Qiniu_Rio_Put($upToken, $key, $body, $fsize, $putExtra) // => ($putRet, $err)
- {
- global $QINIU_UP_HOST;
- $self = new Qiniu_Rio_UploadClient($upToken);
- $progresses = array();
- $uploaded = 0;
- while ($uploaded < $fsize) {
- $tried = 0;
- $tryTimes = ($putExtra->TryTimes > 0) ? $putExtra->TryTimes : 1;
- $blkputRet = null;
- $err = null;
- if ($fsize < $uploaded + QINIU_RIO_BLOCK_SIZE) {
- $bsize = $fsize - $uploaded;
- } else {
- $bsize = QINIU_RIO_BLOCK_SIZE;
- }
- while ($tried < $tryTimes) {
- list($blkputRet, $err) = Qiniu_Rio_Mkblock($self, $QINIU_UP_HOST, $body, $bsize);
- if ($err === null) {
- break;
- }
- $tried += 1;
- continue;
- }
- if ($err !== null) {
- return array(null, $err);
- }
- if ($blkputRet === null ) {
- $err = new Qiniu_Error(0, "rio: uploaded without ret");
- return array(null, $err);
- }
- $uploaded += $bsize;
- $progresses []= $blkputRet;
- }
- $putExtra->Progresses = $progresses;
- return Qiniu_Rio_Mkfile($self, $QINIU_UP_HOST, $key, $fsize, $putExtra);
- }
- function Qiniu_Rio_PutFile($upToken, $key, $localFile, $putExtra) // => ($putRet, $err)
- {
- $fp = fopen($localFile, 'rb');
- if ($fp === false) {
- $err = new Qiniu_Error(0, 'fopen failed');
- return array(null, $err);
- }
- $fi = fstat($fp);
- $result = Qiniu_Rio_Put($upToken, $key, $fp, $fi['size'], $putExtra);
- fclose($fp);
- return $result;
- }
- // ----------------------------------------------------------
|