七牛雲端儲存之圖片的上傳【PHP】
阿新 • • 發佈:2019-02-07
由於七牛雲端儲存使用了名稱空間USE,名稱空間是在PHP5.3才引入的,所以5.3之前的版本會報錯的哦
第一、下載七牛雲端儲存SDK對應的PHP版本
第二、解壓檔案(我重新命名為了qiniusdk),放到專案根目錄
第三、確定上傳檔案的機制(HTML上傳,後臺上傳)
第四、上傳成功
詳解第三步(以下程式碼全部與sdk同級目錄):
HTML上傳:
$token的生成:<form method="post" action="http://up.qiniu.com" enctype="multipart/form-data"> <input name="token" type="hidden" value="<?php echo $token;?>"> <input name="file" type="file" /> <input type="submit" value="上傳"/> </form>
<?php
require_once __DIR__ . '/qiniusdk/autoload.php';
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
$accessKey = '換成你的';
$secretKey = '換成你的';
$auth = new Auth($accessKey, $secretKey);
$bucket = '換成你的儲存空間';
$token = $auth->uploadToken($bucket);
?>
點選上傳之後,圖片直接上傳至七牛
如果需要獲取到檔名以及自定義檔名可以增加一個 上傳策略
<?php require_once __DIR__ . '/qiniusdk/autoload.php'; header('Access-Control-Allow-Origin:*'); use Qiniu\Auth; use Qiniu\Storage\UploadManager; $accessKey = 'XXX'; $secretKey = 'YYY'; $auth = new Auth($accessKey, $secretKey); $bucket = 'ZZZ'; $newname = time().'.jpg'; $policy = array( 'saveKey'=>$newname, 'callbackUrl' => 'http://WWW.sinaapp.com/qiniu/callback.php', 'callbackBody' => "name=$(fname)&newname=$newname&toid=12" ); $token = $auth->uploadToken($bucket,NULL, 3600, $policy); ?>
通過地址回撥獲取引數,將id為12的使用者頭像的圖片設定為$newname
callback.php
<?php
$callbackBody = file_get_contents('php://input');
//$callbackBodys = base64_encode(serialize($callbackBody));
$mysql = new SaeMysql();
$sql = "ddd";
$mysql->runSql($sql);
ECHO '{"success":true}';
exit;
至此一個通過html直接上傳到七牛的小功能就實現了;
PHP上傳BASE64:
$accessKey = '58Lg-AxchuJG3Hr4UjgwWmL5LGJdlePRdn6666';
$secretKey = 'Hr47oR6Tdv-AMMvDrgdkuoYdiDScarRD7777';
$bucket = 'melvita';
$auth = new Auth($accessKey, $secretKey);
$upToken = $auth->uploadToken($bucket);
$rand = rand(1111,9999);
$now = time();
$name = 'melvita/'.$now.$rand;
$bodyKey = base64_encode($name);
$str= isset($_POST['imgstr'])?$_POST['imgstr']:false;//圖片BASE64
if($str){
$qiniu = phpCurlImg("http://up-z1.qiniu.com/putb64/-1/key/".$bodyKey,$str,$upToken);
$qiniuArr = json_decode($qiniu,true);
if($qiniuArr['key']==$name){
setcookie('qiniuImg',$name,time()+1000);
$return['info']['code'] = 'S001';
$return['data']['name'] = '_286f67d5b83550bfed5b1ce8b3af0c63';
$return['data']['type'] = 'jpg';
$return['data']['filename'] = 'http://oog4uis9x.bkt.clouddn.com/'.$name;
$return['msg'] = '提交成功';
}else{
$return['status'] = 0;
$return['msg'] = '上傳失敗';
}
}else{
$return['status'] = 0;
$return['msg'] = '引數不全';
}
function phpCurlImg($remote_server,$post_string,$upToken) {
$headers = array();
$headers[] = 'Content-Type:image/png';
$headers[] = 'Authorization:UpToken '.$upToken;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$remote_server);
//curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER ,$headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
JS上傳BASE64:
前端給我的圖片格式是base64:data:image/png;base64,iVBORw....一系列base64編碼,發現七牛有一個上地址 可以直接上傳,單需要把字元"base64,"及其之前的字元都去掉,方法如下
var pic = 'iVBORw0KGgoAAAANSUh...';//圖片base64編碼
var url = "http://up.qiniu.com/putb64/-1/key/YWJj"; //YWJj為圖片名base64編碼
$(document).ready(function(){
$("#putb").click(function(){
$.ajax({
type: "POST",
url: url,
data: pic,
headers: {'Content-Type': 'application/octet-stream','Authorization': 'UpToken <?php echo $upToken?>'},
success:function(result){
console.log(msg);
}
});
});
});
//原始JS寫的AJAX
var url = "http://up.qiniu.com/putb64/-1/key/YWJj";
var xhr = new XMLHttpRequest();
var xhrget = new XMLHttpRequest();
var obj;
xhr.onreadystatechange=function(){
if (xhr.readyState==4){
console.log(xhr.responseText);
}
}
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.setRequestHeader("Authorization", "UpToken <?php echo $upToken?>");
xhr.send(pic);
後臺上傳:
感覺繞來繞去的還是比較麻煩,索性後臺直接呼叫介面直接上傳,這裡需要用到七牛SDK中UploadManager的一個新方法putFile
<?php
require_once __DIR__ . '/qiniusdk/autoload.php';
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
$accessKey = 'XX';
$secretKey = 'YY';
$auth = new Auth($accessKey, $secretKey);
$bucket = 'ZZ';
$token = $auth->uploadToken($bucket);
$uploadMgr = new UploadManager();
//print_r($_FILES['file']['tmp_name']);exit;
$filePath = $_FILES['file']['tmp_name'];//'./php-logo.png';
$key = 'php-logo.png';
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
echo "\n====> putFile result: \n";
if ($err !== null) {
var_dump($err);
} else {
var_dump($ret);
}
html和上面的寫法一樣,只不過action地址改為自己的就可以了
七牛上傳原始碼:https://github.com/rwifeng/qiniudocs/tree/master/demo/simpleuploader