最近有一個項目須要集成七牛雲存儲的圖片存儲和調用功能,程序是基於CodeIgniter 2.1.3的PHP框架。剛拿到手徹底無從下手的感受,由於像框架這種東西,想從官方的PHPSDK集成進去,須要改動不少地方。還好,有前輩蹚水,我等後輩直接參考或者說是拿來用了。上傳插件採用的是plupload。javascript
plupload:www.plupload.com/php
多附件上傳控件plupload的使用心得:www.cnblogs.com/luckybird/archive/2013/01/15/2861072.htmlcss
七牛雲存儲:qiniu.comhtml
爲作備份之用,仍是整篇拉過來一份吧:html5
最近想作個相冊系統,平時都是使用ThinkPHP來開發的,可是此次想換一個PHP框架試試,因而選擇了CodeIgniter框架,由於熟悉了TP框架,因此CodeIgniter學起來也相對容易點.
網上搜了一下,幾乎沒有CodeIgniter結合七牛的案例,加上本身也是初次使用CodeIgniter和七牛,因此花了一成天的時間在研究這個,用到的上傳插件是Plupload,在這裏分享給你們,但願對你們有幫助。
修改七牛php-sdk
首先下載七牛的php-sdk,將壓縮包內的qiniu文件夾放置到CodeIgniter框架application\libraries\文件夾下.由於CodeIgniter的類庫對命名有要求,而七牛sdk的類庫文件名和類名不一致,因此須要稍微修改下sdk裏面的文件名.java
將io.php修改成Qiniu_PutExtra.php
將rs.php修改成Qiniu_RS_GetPolicy.php
將fop.php修改成Qiniu_ImageView.phpjquery
引入Plupload並初始化ajax
<script type="text/javascript" src="<?php echo base_url(); ?>public/js/jquery-1.11.1.min.js" ></script>
<script type="text/javascript" src="<?php echo base_url(); ?>public/js/plupload/plupload.full.min.js" ></script>
<script type="text/javascript" src="<?php echo base_url(); ?>public/js/plupload/jquery.plupload.queue/jquery.plupload.queue.min.js" ></script>
<script type="text/javascript" src="<?php echo base_url(); ?>public/js/plupload/i18n/zh_CN.js" ></script>
<link rel="stylesheet" href="<?php echo base_url(); ?>public/js/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css" />數據庫
在模板中添加標籤,用於顯示上傳區域json
<div id="muilti_uploader">
<p>你的瀏覽器沒有安裝Flash插件,或不支持HTML5</p>
</div>
設置參數,初始化Plupload(下面有個eval的地方須要手動去掉中間的空格)
<script type="text/javascript">
$(function() {
var photos = Array(); // 用於存放照片信息
// 設置參數,初始化Plupload
$("#muilti_uploader").pluploadQueue({
runtimes : 'html5,flash,silverlight,html4',
url : "http://up.qiniu.com/",
chunk_size : '512kb',
rename : true,
dragdrop: true,
filters : {
max_file_size : '10mb',
mime_types: [
{title : "Image files", extensions : "jpg,jpeg,gif,png"},
{title : "Zip files", extensions : "zip"}
]
},
multipart: true,
multipart_params: {
'token': '<?php echo $upToken;?>', //token,須要從服務器獲取
},
flash_swf_url : '<?php echo base_url(); ?>public/js/plupload/Moxie.swf'
});
var uploader = $('#muilti_uploader').pluploadQueue();
//上傳文件以前觸發
uploader.bind('BeforeUpload', function(uploader, file){
var file_ext = file.name.substr(file.name.lastIndexOf(".")); // 圖片後綴
//指定文件的名稱,若是不設置,七牛會默認將文件的hash值做爲文件的名字
uploader.settings.multipart_params.key = parseInt(new Date().valueOf()/1000) + '-' + parseInt(Math.random()*8999 + 1000) + file_ext;
});
//成功上傳一個文件後觸發
uploader.bind('FileUploaded', function(uploader, file, responseObject) {
//將七牛返回的json數據轉換成對象
var res = ev al('('+responseObject.response+')');
//組合文件信息
var photo = new Object();
//由於在數據庫中,我用字段名name來存儲文件名,用path來存儲七牛上的文件名
//因此這裏的photo對象屬性爲name和path,若是你用的字段名和個人不同,請自行修改
photo.name = file.name; // 上傳以前的圖片名稱
photo.path = res.key; // 保存後的圖片名稱(含前綴)
photos.push(photo); //將對象壓入到photos數組
});
//所有文件上傳完成後觸發
uploader.bind('UploadComplete', function(uploader, file){
//文件所有成功上傳後,將數據傳遞給CI框架進行處理
$.ajax({
url: "<?php echo site_url('photo/save'); ?>", //ci框架處理地址
type: "POST",
data: {files:JSON.stringify(photos)},
success: function(msg){
ale rt(msg);
}
});
});
});
</script>
CodeIgniter代碼部分
在控制器中編寫一個方法,用來顯示剛纔的視圖頁面.
/**
* 上傳照片頁面
* @return void
*/
public function upload()
{
//載入七牛sdk類庫
$this->load->library('qiniu/Qiniu_PutExtra');
$this->load->library('qiniu/Qiniu_RS_GetPolicy');
//配置七牛雲存儲,請查看本身的七牛帳號
$bucket = ""; //你的七牛雲存儲的空間名稱
$accessKey = ''; //公鑰
$secretKey = ''; //密鑰
Qiniu_SetKeys($accessKey, $secretKey);
$putPolicy = new Qiniu_RS_PutPolicy($bucket);
//生成token
$data['upToken'] = $putPolicy->Token(null);
//載入視圖
$this->load->view('photo_upload', $data);
}
編寫一個方法,用來存儲文件信息到本身的數據庫.
/**
* 保存照片
* @return string
*/
public function save()
{
//載入七牛SDK類庫
$this->load->library('qiniu/Qiniu_RS_GetPolicy');
$this->load->library('qiniu/Qiniu_ImageView');
$bucket = ""; //你的七牛雲存儲的空間名稱
$domain = ''; //你的七牛雲存儲空間的地址
$accessKey = ''; //公鑰
$secretKey = ''; //密鑰
Qiniu_SetKeys($accessKey, $secretKey);
$imgInfo = new Qiniu_ImageInfo;
// 組合數據
if (isset($_POST['files']) && !empty($_POST['files'])) {
$files = json_decode($_POST['files'], true);
foreach ($files as $key => $value) {
//生成baseUrl
$baseUrl = Qiniu_RS_MakeBaseUrl($domain, $value['path']);
//生成fopUrl
$imgInfoUrl = $imgInfo->MakeRequest($baseUrl);
//獲取七牛上的圖片屬性
// format 圖片類型,如png、jpeg、gif、bmp等。
// width 圖片寬度,單位:像素(px)。
// height 圖片高度,單位:像素(px)。
// colorModel 彩色空間,如palette1六、ycbcr等。
// frameNumber 幀數,gif 圖片會返回此項。
$arr = json_decode(file_get_contents($imgInfoUrl), true);
$files[$key]['name'] = substr($value['name'], 0, strrpos($value['name'], '.')); //只保留文件名部分,去除文件名後綴
$files[$key]['width'] = $arr['width']; //圖片寬度
$files[$key]['height'] = $arr['height']; //圖片高度
$files[$key]['create_time'] = time();//建立時間
}
}
// 插入數據庫
if ($this->db->insert_batch('photos', $files)) {
echo '上傳成功';
die;
} else {
echo '上傳失敗';
die;
}
}
代碼中註釋寫的很全,應該沒有須要補充的地方了,代碼拿來直接可用,很是省心