PHP阿里雲OSS,七牛雲 上傳文件

來源:http://my.oschina.net/rain21/blog/477019php

七牛雲

PHPSDK下載:http://pan.baidu.com/s/1o69TGcMhtml

7.X版本:

DEMO:
ajax

<?php
require_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);
}


  1. 上傳遠程URL文件:
    json

$url='http://img.hb.aicdn.com/b3ddfada312d19dc0be9f17f9ca497767cb657871f50a-Hj44uu_fw658';
$ret=$bucketMgr->fetch($url, $bucket, $key);
print_r($ret);

2.獲取bucket全部文件api

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.獲取單個文件信息
app

list($ret, $err) = $bucketMgr->stat($bucket, $key);
echo "\n====> stat result: \n";
if ($err !== null) {
    var_dump($err);
} else {
    print_r($ret);
}

5.文件上傳
less

$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替換也能夠,暫時沒找到系統函數轉換,也能夠除10000000fetch

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上傳預覽見:http://my.oschina.net/rain21/blog/425565#OSC_h1_1

DEMO:http://t.zy62.com/wx.php/Index/upload

API:http://developer.qiniu.com/docs/v6/api/reference/rs/stat.html

6.X版本

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');

獲取全部文件信息:

<?php
require_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));


阿里雲OSS

獲取bucket資源列表

<?php
require_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',//北京節點
    ));
相關文章
相關標籤/搜索