Browse Source

Pictures and attachments can be uploaded to the cloud service

图片和附件可以上传到云服务
star7th 5 years ago
parent
commit
fe53290b70

+ 14 - 0
server/Application/Api/Controller/AdminSettingController.class.php

@@ -9,9 +9,11 @@ class AdminSettingController extends BaseController {
         $this->checkAdmin();
         $register_open = intval(I("register_open")) ;
         $ldap_open = intval(I("ldap_open")) ;
+        $oss_open = intval(I("oss_open")) ;
         $home_page = intval(I("home_page")) ;
         $home_item = intval(I("home_item")) ;
         $ldap_form = I("ldap_form") ;
+        $oss_setting = I("oss_setting") ;
         D("Options")->set("register_open" ,$register_open) ;
         D("Options")->set("home_page" ,$home_page) ;
         D("Options")->set("home_item" ,$home_item) ;
@@ -54,6 +56,12 @@ class AdminSettingController extends BaseController {
             D("Options")->set("ldap_form" , json_encode( $ldap_form)) ;
         }
         D("Options")->set("ldap_open" ,$ldap_open) ;
+
+        if ($oss_open) {
+            D("Options")->set("oss_setting" , json_encode( $oss_setting)) ;
+        }
+        D("Options")->set("oss_open" ,$oss_open) ;
+
         $this->sendResult(array());
 
     }
@@ -63,21 +71,27 @@ class AdminSettingController extends BaseController {
         $login_user = $this->checkLogin();
         $this->checkAdmin();
         $ldap_open = D("Options")->get("ldap_open" ) ;
+        $oss_open = D("Options")->get("oss_open" ) ;
         $register_open = D("Options")->get("register_open" ) ;
         $ldap_form = D("Options")->get("ldap_form" ) ;
+        $oss_setting = D("Options")->get("oss_setting" ) ;
         $home_page = D("Options")->get("home_page" ) ;
         $home_item = D("Options")->get("home_item" ) ;
         $ldap_form = json_decode($ldap_form,1);
+        $oss_setting = json_decode($oss_setting,1);
+        
         //如果强等于false,那就是尚未有数据。关闭注册应该是有数据且数据为字符串0
         if ($register_open === false) {
             $this->sendResult(array());
         }else{
             $array = array(
                 "ldap_open"=>$ldap_open ,
+                "oss_open"=>$oss_open ,
                 "register_open"=>$register_open ,
                 "home_page"=>$home_page ,
                 "home_item"=>$home_item ,
                 "ldap_form"=>$ldap_form ,
+                "oss_setting"=>$oss_setting ,
                 );
             $this->sendResult($array);
         }

+ 41 - 22
server/Application/Api/Controller/PageController.class.php

@@ -227,29 +227,28 @@ class PageController extends BaseController {
             return false;
         }
 
-        $qiniu_config = C('UPLOAD_SITEIMG_QINIU') ;
-        if (!empty($qiniu_config['driverConfig']['secrectKey'])) {
-          //上传到七牛
-          $Upload = new \Think\Upload(C('UPLOAD_SITEIMG_QINIU'));
-          $info = $Upload->upload($_FILES);
-          $url = $info['editormd-image-file']['url'] ;
-          if ($url) {
-              echo json_encode(array("url"=>$url,"success"=>1));
-          }
-        }else{
-            $upload = new \Think\Upload();// 实例化上传类
-            $upload->maxSize  = 1003145728 ;// 设置附件上传大小
-            $upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
-            $upload->rootPath = './../Public/Uploads/';// 设置附件上传目录
-            $upload->savePath = '';// 设置附件上传子目录
-            $info = $upload->uploadOne($_FILES['editormd-image-file']) ;
-            if(!$info) {// 上传错误提示错误信息
-              $this->error($upload->getError());
-              return;
-            }else{// 上传成功 获取上传文件信息
-              $url = get_domain().__ROOT__.substr($upload->rootPath,1).$info['savepath'].$info['savename'] ;
-              echo json_encode(array("url"=>$url,"success"=>1));
+        $oss_open = D("Options")->get("oss_open" ) ;
+        if ($oss_open) {
+            $uploadFile = $_FILES['editormd-image-file'] ;
+            $url = upload_oss($uploadFile);
+            if ($url) {
+                echo json_encode(array("url"=>$url,"success"=>1));
             }
+            return ;
+        }
+
+        $upload = new \Think\Upload();// 实例化上传类
+        $upload->maxSize  = 1003145728 ;// 设置附件上传大小
+        $upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
+        $upload->rootPath = './../Public/Uploads/';// 设置附件上传目录
+        $upload->savePath = '';// 设置附件上传子目录
+        $info = $upload->uploadOne($_FILES['editormd-image-file']) ;
+        if(!$info) {// 上传错误提示错误信息
+          $this->error($upload->getError());
+          return;
+        }else{// 上传成功 获取上传文件信息
+          $url = get_domain().__ROOT__.substr($upload->rootPath,1).$info['savepath'].$info['savename'] ;
+          echo json_encode(array("url"=>$url,"success"=>1));
         }
 
     }
@@ -278,6 +277,26 @@ class PageController extends BaseController {
             return false;
         }
 
+        $oss_open = D("Options")->get("oss_open" ) ;
+        if ($oss_open) {
+            $url = upload_oss($uploadFile);
+            if ($url) {
+                $insert = array(
+                "uid" => $login_user['uid'],
+                "item_id" => $item_id,
+                "page_id" => $page_id,
+                "display_name" => $uploadFile['name'],
+                "file_type" => $uploadFile['type'],
+                "file_size" => $uploadFile['size'],
+                "real_url" => $url,
+                "addtime" => time(),
+                );
+                $ret = D("UploadFile")->add($insert);
+                echo json_encode(array("url"=>$url,"success"=>1));
+            }
+            return ;
+        }
+
         $upload = new \Think\Upload();// 实例化上传类
         $upload->maxSize  = 4145728000 ;// 设置附件上传大小
         $upload->rootPath = './../Public/Uploads/';// 设置附件上传目录

+ 4 - 8
server/Application/Api/Model/PageModel.class.php

@@ -152,15 +152,11 @@ class PageModel extends BaseModel {
       $real_url = $file['real_url'] ;
       $array = explode("/Public/Uploads/", $real_url) ;
       $file_path = "../Public/Uploads/".$array[1] ;
-      $ret = unlink($file_path);
-      if ($ret) {
-          D("UploadFile")->where(" file_id = '$file_id' ")->delete();
-          return true ;
-      }else{
-          return false;
+      if (file_exists($file_path)) {
+        unlink($file_path);
       }
-
-
+      D("UploadFile")->where(" file_id = '$file_id' ")->delete();
+      return true ;
     }
 
 }

+ 53 - 0
server/Application/Common/Common/function.php

@@ -212,4 +212,57 @@ function new_oss($key , $secret , $endpoint , $isCName = false)
 {  
     include_once VENDOR_PATH .'Alioss/autoload.php';
     return new \OSS\OssClient($key , $secret , $endpoint , $isCName);
+}
+
+//上传到oss。参数$uploadFile是文件上传流,如$_FILES['file'] .也可以自己拼凑
+function upload_oss($uploadFile){
+    $oss_setting_json = D("Options")->get("oss_setting") ;
+    $oss_setting = json_decode($oss_setting_json,1);
+    if ($oss_setting && $oss_setting['oss_type'] && $oss_setting['oss_type'] == 'aliyun') {
+        $config = array(
+            "key" => $oss_setting['key'],
+            "secret"=> $oss_setting['secret'],
+            "endpoint"=> $oss_setting['endpoint'],
+            "bucket"=> $oss_setting['bucket'],
+        );
+        $oss = new_oss($config['key'] , $config['secret'] , $config['endpoint'] );
+        $ext = strrchr($uploadFile['name'], '.'); //获取扩展名
+        $oss_path = "showdoc_".time().rand().$ext;
+        $res = $oss->uploadFile($config['bucket'],$oss_path,$uploadFile['tmp_name']);
+        if ($res && $res['info'] && $res['info']['url']) {
+            if ($oss_setting['domain']) {
+                return $oss_setting['protocol'] . '://'.$oss_setting['domain']."/".$oss_path ;
+            }else{
+                return $res['info']['url'] ;
+            }
+           
+        }
+    }
+
+    if ($oss_setting && $oss_setting['oss_type'] && $oss_setting['oss_type'] == 'qiniu') {
+        $config = array(
+                    'rootPath' => './',
+                    'saveName' => array('uniqid', ''),
+                    'driver' => 'Qiniu',
+                    'driverConfig' => array(
+                            'accessKey' => $oss_setting['key'],
+                            'secrectKey' => $oss_setting['secret'], 
+                            'protocol'=>$oss_setting['protocol'],
+                            'domain' => $oss_setting['domain'],
+                            'bucket' => $oss_setting['bucket'], 
+                        )
+          );
+          //上传到七牛
+          $Upload = new \Think\Upload($config);
+          $info = $Upload->uploadOne($uploadFile);
+          if ($info && $info['url']) {
+              return $info['url'] ;
+          }
+
+    }
+    //var_dump($config);
+
+
+  return false ;
+
 }

+ 51 - 1
web_src/src/components/admin/setting/Index.vue

@@ -70,8 +70,46 @@
        
       </div>
 
+      <el-form-item :label="$t('oss_open')" >
+        <el-switch v-model="form.oss_open"></el-switch>
+      </el-form-item>
+
+      <div v-if="form.oss_open" style="margin-left:50px" >
+
+        <el-form-item :label="$t('oss_server')">
+          <el-select v-model="form.oss_setting.oss_type" >
+            <el-option :label="$t('aliyun')" value="aliyun"></el-option>
+            <el-option :label="$t('qiniu')"  value="qiniu"></el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="key">
+           <el-input v-model="form.oss_setting.key"   class="form-el"></el-input>
+        </el-form-item>
+
+        <el-form-item label="secret">
+           <el-input v-model="form.oss_setting.secret"   class="form-el"></el-input>
+        </el-form-item>
 
+        <el-form-item label="endpoint" v-if="form.oss_setting.oss_type == 'aliyun'" >
+           <el-input v-model="form.oss_setting.endpoint"   class="form-el"></el-input>
+        </el-form-item>
+
+        <el-form-item label="bucket">
+           <el-input v-model="form.oss_setting.bucket"   class="form-el"></el-input>
+        </el-form-item>
 
+        <el-form-item :label="$t('oss_domain')">
+          <el-select v-model="form.oss_setting.protocol" style="width:100px;" >
+            <el-option label="http://" value="http"></el-option>
+            <el-option label="https://" value="https"></el-option>
+          </el-select>
+           <el-input v-model="form.oss_setting.domain"   class="form-el"></el-input>
+        </el-form-item>
+
+      </div>
+
+      <br>
       <el-form-item >
         <el-button type="primary" @click="onSubmit">{{$t('save')}}</el-button>
         <el-button>{{$t('cancel')}}</el-button>
@@ -107,7 +145,17 @@ export default {
           "bind_password":'',
           "user_field":'',
         },
-        home_item:''
+        home_item:'',
+        oss_open:false,
+        oss_setting:{
+           "oss_type":"aliyun",
+           "key" : "",
+           "secret" : "",
+           "endpoint" :"",
+           "bucket" : "",
+           "protocol" : "http",
+           "domain" : ""
+        },
       },
       itemList:[],
     };
@@ -135,10 +183,12 @@ export default {
               return ;
             };
             this.form.register_open =   response.data.data.register_open > 0 ? true :false ;
+            this.form.oss_open =   response.data.data.oss_open > 0 ? true :false ;
             this.form.ldap_open =   response.data.data.ldap_open > 0 ? true :false ;
             this.form.home_page =   response.data.data.home_page > 0 ? response.data.data.home_page :1 ;
             this.form.home_item =   response.data.data.home_item > 0 ? response.data.data.home_item :'' ;
             this.form.ldap_form =   response.data.data.ldap_form ? response.data.data.ldap_form : this.form.ldap_form ;
+            this.form.oss_setting =   response.data.data.oss_setting ? response.data.data.oss_setting : this.form.oss_setting ;
           }else{
             this.$alert(response.data.error_message);
           }

+ 7 - 0
web_src/static/lang/en.js

@@ -322,4 +322,11 @@ exports.default = {
     "export_markdown_tips":"The exported compressed package can be re imported into showdoc. Select 'Import File' when creating a new item",
 
     "private_tips":"It's a private item",
+
+    "oss_open":"Image/attachment saved to cloud",
+    "oss_server":"cloud server",
+    "aliyun":"aliyun",
+    "qiniu":"qiniu",
+    "oss_domain":"domain(optional)",
+
 };

+ 6 - 0
web_src/static/lang/zh-CN.js

@@ -331,5 +331,11 @@ exports.default = {
     
     "private_tips":"这是一个私密项目",
 
+    "oss_open":"图片附件储存到云",
+    "oss_server":"云服务商",
+    "aliyun":"阿里云",
+    "qiniu":"七牛云",
+    "oss_domain":"oss绑定域名(选填)",
+
     
 };