需求:
與安卓交互需要用到圖片上傳,由於PHP接收不到文件形式,所以轉成base64編碼上傳;
實現:
首先在控制器中引入加上
header('Content-type:text/html;charset=utf-8');
vendor('Qiniu.autoload');
use Qiniu\Auth as Auth;
use Qiniu\Storage\UploadManager;
讓安卓傳兩個參數,第一個參數“base64編碼(看好編碼前面必須是data:image/jpg;base64,開頭的,不然上傳失敗)”,第二個參數:‘文件名不要後綴名’(這裏根據自己的需要也可以不傳文件名稱,自己生成);
代碼實現:
public function files()
{
//得到文件對象
$base64_image_content = $_POST['file'];
$addName = $_POST['filename'];
$str = '';
$str = $this->upload($base64_image_content,$addName);
if(!empty($str)){
return json(
array(
'code'=>200,
'msg'=>'上傳成功',
'data'=>$str
)
);
} else {
return json(
array(
'code'=>400,
'msg'=>'上傳失敗',
)
);
}
}
執行上傳代碼
public function upload($base64_image_content,$addName)
{
//匹配出圖片的格式
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
$type = $result[2];
$new_file = "./uploads/default/".date('Ymd',time());
if(!file_exists($new_file))
{
//檢查是否有該文件夾,如果沒有就創建,並給予最高權限
mkdir($new_file, 0777);
}
$new_file = $new_file.'/'.md5($addName).".{$type}";
//print_r($new_file);die;
//解碼圖片
if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
//調用七牛雲上傳
$res = $this->qinius($new_file,md5($addName));
if($res){
return $new_file;
} else {
// 上傳失敗獲取錯誤信息
$this->error('雲上傳失敗,請重新上傳');
}
}else{
unlink($new_file);
echo '保存失敗';
}
}
}
執行七牛雲上傳
public function qinius($filePath,$filename)
{
//獲取當前控制器名稱
//$controllerName = 'index';
// 上傳到七牛後保存的文件名
$key = $filename;
// 需要填寫你的 Access Key 和 Secret Key
$accessKey = '你自己的ak';
$secretKey = '你自己的sk';
// 構建鑑權對象
$auth = new Auth($accessKey, $secretKey);
//var_dump($auth);die;
// 要上傳的空間
$bucket = '空間名;
$domain = '七牛雲空間域名';
$token = $auth->uploadToken($bucket);
// 初始化 UploadManager 對象並進行文件的上傳
$uploadMgr = new UploadManager();
// 調用 UploadManager 的 putFile 方法進行文件的上傳
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
if ($err !== null) {
echo ["err"=>1,"msg"=>$err,"data"=>""];
} else {
//返回圖片的完整文件名稱
return $ret;
}
}