最近在用PHP和laravel框架作一個圖片網站,須要將圖片存貯到雲端,搜索下了對比了下功能,發現七牛雲存儲不錯(主要小流量免費),便選擇使用七牛做爲圖片存儲空間。 要實現的功能很簡單,選擇本地圖片上傳到七牛,上傳成功後添加圖片及上傳者信息到數據庫。本文主要講php經過七牛php-sdk顯現簡單的圖片上傳。
一、已存在php5.4,laravel5,mysql5.5(沒有使用到),composer,七牛帳號(註冊[傳送門](https://portal.qiniu.com/signup)) 二、安裝php-sdk,採用composer安裝,打開laravel根目錄下的composer.json,添加"qiniu/php-sdk": "~7.0"到require關鍵字下,保存,運行composer update安裝,即完成php-sdk的安裝。![composer配置](http://img.blog.csdn.net/20150413194853209) 三、在config目錄下添加qiniu.php配置文件,配置七牛相關的信息,配置以下
<?php
/** * 七牛上傳配置 */ return [ 'accessKey'=>'yourAccesskey', 'secretKey'=>'yourSecretkey', 'bucket'=>'fpstatic',//上傳空間名稱 'domain'=>'http://7xidgf.com1.z0.glb.clouddn.com' ];//空間域名
四、添加UploadController 控制器,並在router.php文件中添加一條路由,以下 `Route::controller('upload','UploadController');`
先貼整個控制器代碼
<?php namespace App\Http\Controllers; use App\Http\Requests; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use PhpParser\Node\Expr\Variable; use Illuminate\Support\Facades\Redis; use Illuminate\Support\Facades\Input; //導入七牛相關類 use Qiniu\Auth; use Qiniu\Storage\BucketManager; use Qiniu\Storage\UploadManager; class UploadController extends Controller { public function __construct(){ $this->middleware('activeUsers'); } public function getIndex() { var_dump(isset($ret)); $data=$this->getPageData();//獲取頁面顯示所需數據 $data['uploadSelected']=true; return view('portal/upload')->with('data',$data); } /** * 獲取頁面顯示所需數據 * @return multitype:boolean \Illuminate\Support\Facades\mixed NULL */ private function getPageData(){ $data=[];//返回視圖數據 $data['loginCount']=Redis::get('loginNum');//登錄人數 $data['activeUsersCount']=Input::get('activeUsers');//活躍人數 return $data; } public function postDoupload(){ $token=$this->getToken(); $uploadManager=new UploadManager(); $name=$_FILES['file']['name']; $filePath=$_FILES['file']['tmp_name']; $type=$_FILES['file']['type']; list($ret,$err)=$uploadManager->putFile($token,$name,$filePath,null,$type,false); if($err){//上傳失敗 var_dump($err); return redirect()->back()->with('err',$err);//返回錯誤信息到上傳頁面 }else{//成功 //添加信息到數據庫 return redirect()->back()->with('key',$ret['key']);//返回結果到上傳頁面 } } /** * 生成上傳憑證 * @return string */ private function getToken(){ $accessKey=config('qiniu.accessKey'); $secretKey=config('qiniu.secretKey'); $auth=new Auth($accessKey, $secretKey); $bucket=config('qiniu.bucket');//上傳空間名稱 //設置put policy的其餘參數 //$opts=['callbackUrl'=>'http://www.callback.com/','callbackBody'=>'name=$(fname)&hash=$(etag)','returnUrl'=>"http://www.baidu.com"]; return $auth->uploadToken($bucket);//生成token } }
視圖代碼javascript
@extends('common/index')
@section('content')
<div class="row clearfix"> <div class="col-md-4 column"> </div> <div class="col-md-4 column"> <form name="form" role="form" method="post" action="{{url('/upload/doupload')}}" enctype="multipart/form-data" onsubmit="return isValidateFile('file');"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="form-group"> <label for="exampleInputFile">選擇文件</label><input type="file" name='file' /> <p class="help-block"> </p> </div> <button type="submit" class="btn btn-default">上傳</button> </form> </div> <div class="col-md-4 column"> @if (session('key')) <img alt="140x140" src="<?php echo config('qiniu.domain').'/'.session('key')?>?imageView2/2/w/400/h/400" class="img-rounded" /> @endif </div> </div> <script> function isValidateFile(obj) { var extend = document.form.file.value.substring(document.form.file.value.lastIndexOf(".") + 1); if (extend == "") { alert("請選擇圖片!"); return false; } else { if (!(extend == "jpg" || extend == "png" || extend =="gif")) { alert("請上傳後綴名爲jpg、png或gif的文件!"); return false; } } return true; } </script> @endsection
一、流程: 上傳頁面選擇圖片,點擊提交,提交到/upload/doupload,路由解析到uploadController下的postDoupload(不懂查看laravel手冊路由章節,不用laravel就無所謂了,提交到對控制器器方法便可) 2上傳流程 ![上傳流程](http://img.blog.csdn.net/20150413204935125) so咱們首先要生成uptoken 三、導入七牛sdk相關的類
use Qiniu\Auth; use Qiniu\Storage\BucketManager; use Qiniu\Storage\UploadManager;
讀取配置文件中的key,生成token方法
/** * 生成上傳憑證 * @return string */ private function getToken(){ $accessKey=config('qiniu.accessKey'); $secretKey=config('qiniu.secretKey'); $auth=new Auth($accessKey, $secretKey); $bucket=config('qiniu.bucket');//上傳空間名稱 //設置put policy的其餘參數 //$opts=['callbackUrl'=>'http://www.callback.com/','callbackBody'=>'name=$(fname)&hash=$(etag)','returnUrl'=>"http://www.baidu.com"]; return $auth->uploadToken($bucket);//生成token }
而後就要上傳文件了,文件post到了這個方法php
public function postDoupload(){ $token=$this->getToken(); $uploadManager=new UploadManager(); $name=$_FILES['file']['name']; $filePath=$_FILES['file']['tmp_name']; $type=$_FILES['file']['type']; list($ret,$err)=$uploadManager->putFile($token,$name,$filePath,null,$type,false); if($err){//上傳失敗 var_dump($err); return redirect()->back()->with('err',$err);//返回錯誤信息到上傳頁面 }else{//成功 //添加信息到數據庫 return redirect()->back()->with('key',$ret['key']);//返回結果到上傳頁面 } }
這裏關鍵的一點是
$uploadManager->putFile($token,$name,$filePath,null,$type,false);
官方文檔是這樣的
list($ret, $err) = $uploadMgr->putFile($token, null, __file__);
坑爹的一點是,
__file__
不講清楚,那隻好去查他的源碼了,
查看後獲得,putFile方法參數依次爲token,存儲的文件名,真是路徑,參數,和文件類型,傳入相應的參數便可成功完成上傳
4,在文件上傳頁面,點擊提交以前檢測文件是否爲圖片格式,這裏參考的是一位網友的js判斷html
<script> function isValidateFile(obj) { var extend = document.form.file.value.substring(document.form.file.value.lastIndexOf(".") + 1); if (extend == "") { alert("請選擇圖片!"); return false; } else { if (!(extend == "jpg" || extend == "png" || extend =="gif")) { alert("請上傳後綴名爲jpg、png或gif的文件!"); return false; } } return true; } </script>
要注意的是記得給html頁面中form的name屬性設置爲「form」java
五、上傳成功後,將上傳的圖片顯示在上傳頁面(固然也能夠是其餘頁面,僅測試),直接使用上傳成功後返回的key(即文件名)以及空間域名來生成完整的地址(固然不建議這樣)mysql
這僅僅是一個簡單的例子,實現上傳到七牛雲存儲的方法還有不少種(好比直接利用表單上傳),具體可搜索【php 七牛】關鍵字。同時利用七牛也能進行功能豐富的圖片處理,可查看七牛文檔。 [代碼地址](https://github.com/kpmving/FP "optional title")