来源:
七牛云PHPSDK下载:http://pan.baidu.com/s/1o69TGcM
DEMO:
<?phprequire_once './vendor/autoload.php'; use Qiniu\Auth;use Qiniu\Storage\BucketManager;use Qiniu\Storage\UploadManager; $accessKey = 'accessKey';$secretKey = 'secretKey';$auth = new Auth($accessKey, $secretKey); $bucketMgr = New BucketManager($auth);$bucket = 'wsy100';$key = 'QQ图片20150604131612.png'; //文件删除/* $err = $bucketMgr->delete($bucket, $key);if ($err !== null) { var_dump($err);} else { echo 'delete ok';} *//* * 单个文件 * list($ret, $err) = $bucketMgr->stat($bucket, $key);echo "\n====> stat result: \n";if ($err !== null) { var_dump($err);} else { var_dump($ret);} */$token = $auth->uploadToken($bucket);$uploadMgr = New UploadManager(); list($ret, $err) = $uploadMgr->putFile($token, time().'.jpg', 'C:\Users\Administrator\Pictures\images\20150604131612.png');echo "\n====> putFile result: \n";if ($err !== null) { var_dump($err);} else { print_r($ret);}
上传远程URL文件:
$url='http://img.hb.aicdn.com/b3ddfada312d19dc0be9f17f9ca497767cb657871f50a-Hj44uu_fw658';$ret=$bucketMgr->fetch($url, $bucket, $key);print_r($ret);
2.获取bucket所有文件
list($items, $marker, $err) = $bucketMgr->listFiles($bucket, $prefix = null, $marker = null, $limit = 1000, $delimiter = null);echo "\n====> List result: \n";if ($err !== null) { var_dump($err);} else { echo "Marker: $marker\n"; echo 'items====>\n'; print_r($items); //echo (string)$items[10]['putTime']; //echo strtotime($items[10]['putTime']);}
3.删除文件
$err = $bucketMgr->delete($bucket, $key);if ($err !== null) { var_dump($err);} else { echo 'delete ok';}
4.获取单个文件信息
list($ret, $err) = $bucketMgr->stat($bucket, $key);echo "\n====> stat result: \n";if ($err !== null) { var_dump($err);} else { print_r($ret);}
5.文件上传
$token = $auth->uploadToken($bucket);$uploadMgr = New UploadManager(); list($ret, $err) = $uploadMgr->putFile($token, date('Y-m-d-H-i-s',time()).'.jpg', 'C:\Users\Administrator\Pictures\20150504194317.png');echo "\n====> putFile result: \n";if ($err !== null) { var_dump($err);} else { print_r($ret);}
puttime Epoch时间戳的转换
$puttime=substr(str_replace('.', '','1.4357550505488E+16'),0,10);echo $puttime;
trim替换也可以,暂时没找到系统函数转换,也可以除10000000
OR
$puttime=date('Y-m-d H:i:s',1.4357550505488E+16/10000000);
上传策略生成:
$data['scope']='wsy100';$data['deadline']=time()+3600;$encoded=urlsafe_base64_encode(json_encode($data));$signature=hash_hmac('sha1',$encoded,'KEY',true);$encode_signed = urlsafe_base64_encode($signature);$UploadToken='AK:'.$encode_signed.':'.$encoded; echo $UploadToken; /* 第三步:对json序列化后的上传策略进行URL安全的Base64编码,得到如下encoded:eyJzY29wZSI6IndzeTEwMCIsImRlYWRsaW5lIjoxNDM1ODE3NzA5fQ==第四步:用SecretKey对编码后的上传策略进行HMAC-SHA1加密,并且做URL安全的Base64编码,得到如下的encoded_signed:Yu1NpdDvbM1NPr4IxTFsMBLxDQc=第五步:将 AccessKey、encode_signed 和 encoded 用 “:” 连接起来,得到如下的UploadToken:*/ function urlsafe_base64_encode($data) { $data = base64_encode($data); $data = str_replace(array('+','/'),array('-','_'),$data); return $data;}
写完才知道有现成的
$token = $auth->uploadToken($bucket);
可以用。权当练手了吧
ajax上传预览见:
DEMO:http://t.zy62.com/wx.php/Index/upload
API:http://developer.qiniu.com/docs/v6/api/reference/rs/stat.html
6.x版本没有fetch获取远程URL资源上传的方法,封装了个.
七牛文档:http://developer.qiniu.com/docs/v6/sdk/legacy-php-sdk.html
封装好的下载地址:http://pan.baidu.com/s/1gdu95yb
在qiniu/conf.php 15行后加了:
$QINIU_FETCH_HOST='http://iovip.qbox.me';//fetch URL
rsf.php末尾增加:
/** * 从指定URL抓取资源,并将该资源存储到指定空间中 * * @param $url 指定的URL * @param $bucket 目标资源空间 * @param $key 目标资源文件名 * * @return array[] 包含已拉取的文件信息。 * 成功时: [ * [ * "hash" => "<Hash string>", * "key" => "<Key string>" * ], * null * ] * * 失败时: [ * null, * Qiniu/Http/Error * ] * @link http://developer.qiniu.com/docs/v6/api/reference/rs/fetch.html */function Qiniu_Fetch($self,$url, $bucket, $key) { global $QINIU_FETCH_HOST; $resource = base64_urlSafeEncode ( $url ); $to = entry ( $bucket, $key ); $url = $QINIU_FETCH_HOST . '/fetch/' . $resource . '/to/' . $to; return Qiniu_Client_Call ( $self, $url );}/** * 计算七牛API中的数据格式 * * @param $bucket 待操作的空间名 * @param $key 待操作的文件名 * * @return 符合七牛API规格的数据格式 * @link http://developer.qiniu.com/docs/v6/api/reference/data-formats.html */function entry($bucket, $key) { $en = $bucket; if (! empty ( $key )) { $en = $bucket . ':' . $key; } return base64_urlSafeEncode ( $en );}/** * 对提供的数据进行urlsafe的base64编码。 * * @param string $data 待编码的数据,一般为字符串 * * @return string 编码后的字符串 * @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64 */function base64_urlSafeEncode($data){ $find = array('+', '/'); $replace = array('-', '_'); return str_replace($find, $replace, base64_encode($data));}
使用方法:
Qiniu_Fetch($client,'http://phpcto.b0.upaiyun.com/courselesson/3/2015104031642-h23061.mp4',$bucket,time().'.mp4');
获取所有文件信息:
<?phprequire_once("qiniu/rs.php");require_once("qiniu/rsf.php");$bucket = 'wsy100';$key = "qqConnect_Server_SDK_php_v2.0.zip";$accessKey = '';$secretKey = ''; Qiniu_SetKeys($accessKey, $secretKey);$client = new Qiniu_MacHttpClient(null);$putPolicy = new Qiniu_RS_PutPolicy($bucket);$upToken = $putPolicy->Token(null); //echo $upToken;exit();/* list($ret, $err) = Qiniu_RS_Stat($client, $bucket, $key);echo "Qiniu_RS_Stat result: \n";if ($err !== null) { print_r($err);} else { $ret['putTime']=date('Y-m-d H:i:s',$ret['putTime']/10000000); print_r($ret);} */print_r(Qiniu_RSF_ListPrefix($client,$bucket));
获取bucket资源列表
<?phprequire_once './aliyun.php';use \Aliyun\OSS\OSSClient;try { $client = OSSClient::factory(array( 'AccessKeyId' => '//Your AccessKeyId', 'AccessKeySecret' => 'Your AccessKeySecret', //在https://ak-console.aliyun.com/获取));$client->createBucket(array( 'Bucket' => 'Your Bucket',)); $objectListing = $client->listObjects(array( 'Bucket' => 'Your Bucket',));foreach ($objectListing->getObjectSummarys() as $objectSummary) { echo $objectSummary->getKey();}} catch (\Aliyun\OSS\Exceptions\OSSException $ex) { echo "Error: " . $ex->getErrorCode() . "\n";} catch (\Aliyun\Common\Exceptions\ClientException $ex) { echo "ClientError: " . $ex->getMessage() . "\n";}
Fatal error: Uncaught exception 'Aliyun\OSS\Exceptions\OSSException' with message 'The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.'解决方案
原因是PHP SDK默认使用杭州节点,而你的bucket非杭州节点,解决方案,在初始化时指定节点.
$client = OSSClient::factory(array( 'AccessKeyId' => 'Your AccessKeyId', 'AccessKeySecret' => 'Your AccessKeySecret', 'Endpoint' => 'http://oss-cn-beijing.aliyuncs.com',//北京节点 ));