七牛圖片上傳方法我們只要在框架中配置它的接口及上傳的些小細節就可以實現了,下面一起來看一個關于配置Thinkphp3.2支持七牛圖片上傳的方法,希望文章對各位有幫助.
作為php菜鳥,在公司搗鼓的一個基于thinkphp框架項目上要是用七牛(原來有用過C#版本的sdk),現在在官方找到php的官方sdk,最后發現原來Thinkphp已經支持驅動類型是qiniu的文件上傳了.
現在將配置說明一下。
利用七牛云私有空間存儲文件
注冊七牛云,創建空間,將空間設為私有
需要記下的東西:
AK,SK,bucket
在config.php添加:
- //七牛上傳文件設置
- 'PICTURE_UPLOAD_DRIVER'=>'Qiniu',
- //本地上傳文件驅動配置
- 'UPLOAD_LOCAL_CONFIG'=>array(),
- 'UPLOAD_QINIU_CONFIG'=>array(
- 'accessKey'=>'l3N4q0XCqm0rssaaMTHryZYG-LnKMH',
- 'secrectKey'=>'7qPVaeRasasan2TjALqQAjF0h6jOt0D1jF',
- 'bucket'=>'yaasasnbao',
- 'domain'=>'7xasssa.com2.z0.glb.qiniucdn.com',
- 'timeout'=>3600,
- ),
3、添加一個上傳類Model
- <?php
- // +----------------------------------------------------------------------
- // | OneThink [ WE CAN DO IT JUST THINK IT ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Author: huajie <[email protected]>
- // +----------------------------------------------------------------------
- namespace Admin/Model;
- use Think/Model;
- use Think/Upload;
- /**
- * 圖片模型
- * 負責圖片的上傳
- */
- class PictureModel extends Model{
- /**
- * 自動完成
- * @var array
- */
- protected $_auto = array(
- array('status', 1, self::MODEL_INSERT),
- array('create_time', NOW_TIME, self::MODEL_INSERT),
- );
- /**
- * 文件上傳
- * @param array $files 要上傳的文件列表(通常是$_FILES數組)
- * @param array $setting 文件上傳配置
- * @param string $driver 上傳驅動名稱
- * @param array $config 上傳驅動配置
- * @return array 文件上傳成功后的信息
- */
- public function upload($files, $setting, $driver = 'Local', $config = null){
- /* 上傳文件 */
- $Upload = new Upload($setting, $driver, $config);
- $info = $Upload->upload($files);
- if($info){ //文件上傳成功,記錄文件信息
- return $info; //文件上傳成功
- } else {
- $this->error = $Upload->getError();
- return false;
- }
- }
- /**
- * 下載指定文件
- * @param number $root 文件存儲根目錄
- * @param integer $id 文件ID
- * @param string $args 回調函數參數
- * @return boolean false-下載失敗,否則輸出下載文件
- */
- public function download($root, $id, $callback = null, $args = null){
- /* 獲取下載文件信息 */
- $file = $this->find($id);
- if(!$file){
- $this->error = '不存在該文件!';
- return false;
- }
- /* 下載文件 */
- switch ($file['location']) {
- case 0: //下載本地文件
- $file['rootpath'] = $root;
- return $this->downLocalFile($file, $callback, $args);
- case 1: //TODO: 下載遠程FTP文件
- break;
- default:
- $this->error = '不支持的文件存儲類型!';
- return false;
- }
- }
- /**
- * 檢測當前上傳的文件是否已經存在
- * @param array $file 文件上傳數組
- * @return boolean 文件信息, false - 不存在該文件
- */
- public function isFile($file){
- if(emptyempty($file['md5'])){
- throw new /Exception('缺少參數:md5');
- }
- /* 查找文件 */
- $map = array('md5' => $file['md5'],'sha1'=>$file['sha1'],);
- return $this->field(true)->where($map)->find();
- }
- /**
- * 下載本地文件
- * @param array $file 文件信息數組
- * @param callable $callback 下載回調函數,一般用于增加下載次數
- * @param string $args 回調函數參數
- * @return boolean 下載失敗返回false
- */
- private function downLocalFile($file, $callback = null, $args = null){
- if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
- /* 調用回調函數新增下載數 */
- is_callable($callback) && call_user_func($callback, $args);
- /* 執行下載 */ //TODO: 大文件斷點續傳
- header("Content-Description: File Transfer");
- header('Content-type: ' . $file['type']);
- header('Content-Length:' . $file['size']);
- if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
- header('Content-Disposition: attachment; filename="' . rawurlencode($file['name']) . '"');
- } else {
- header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
- }
- readfile($file['rootpath'].$file['savepath'].$file['savename']);
- exit;
- } else {
- $this->error = '文件已被刪除!';
- return false;
- } //Vevb.com
- }
- /**
- * 清除數據庫存在但本地不存在的數據
- * @param $data
- */
- public function removeTrash($data){
- //$this->where(array('id'=>$data['id'],))->delete();
- }
- }
4、修改調用上傳類的代碼
- public function ImgUpload()
- {
- //$this->error("沒有文件!");
- //TODO: 用戶登錄檢測
- /* 調用文件上傳組件上傳文件 */
- $Picture = D('Picture');
- $pic_driver = C('PICTURE_UPLOAD_DRIVER');
- $info = $Picture->upload(
- $_FILES,
- C('PICTURE_UPLOAD'),
- C('PICTURE_UPLOAD_DRIVER'),
- C("UPLOAD_{$pic_driver}_CONFIG")
- ); //TODO:上傳到遠程服務器
- /* 記錄圖片信息 */
- if($info){
- /* 返回JSON數據 */
- echo json_encode($info);
- } else {
- echo json_encode($info);
- }
- }
5、在客戶端使用ajaxfileupload調用php方法
- //上傳圖片
- $(document).on('change','#upfile',function(){
- $.ajaxFileUpload({
- url:'{:U("Company/ImgUpload")}',
- secureuri:false,
- fileElementId:'upfile',
- dataType: 'json',
- type:'post',
- data: { fileElementId: 'upfile'},
- success: function (data) {
- $('#showimg').attr('src',data.upfile.url);
- $('#imageurl').val(data.upfile.url);
- }
- })
- })
這里最好使用json的數據類型進行傳輸.
新聞熱點
疑難解答
圖片精選