1. 程式人生 > >百度富文字編輯器UEditor:PHP + Nginx 後端配置圖片上傳,下載

百度富文字編輯器UEditor:PHP + Nginx 後端配置圖片上傳,下載

由於公司專案需求,花了點時間研究UEditor的後端配置,分享一下使用經驗。

注意,這裡的圖片上傳配置,僅能保證圖片管理器的上傳下載正常,而單張照片上傳,後端顯示成功,也接收到檔案了,可是前端會報錯,筆者沒有找到解決方案,所以註釋掉了單張照片上傳的功能,以後有時間再研究。

1.後端專案檔案分析

    首先下載下來的PHP後端檔案是一個資料夾,內容如下:


    其中比較重要的是如下兩個:

config.json:引數檔案
controller.php:入口檔案

    入口檔案是所有上傳功能的入口,也是前端應用讀取後端引數的一個入口。

    引數檔案則包含了上傳路徑,下載路徑等引數配置。

2.配置Nginx跳轉至入口檔案

    由於官方的PHP後端程式碼,並沒有考慮和框架整合的情況。所以和專案的整合有兩種處理方式,第一種,閱讀原始碼,重新編寫整合到專案中,第二種,讓伺服器直接跳轉相應的請求到UEditor專案目錄。

    正如小標題,筆者比較懶,選擇了後者。以下是nginx的引數檔案例子:

server {
    listen 8888;

    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/ueditor.access.log  main;
    error_log   /var/log/nginx/ueditor.error.log; 
 
    location / { 
        index controller.php;    #入口檔案要寫成controller.php,而不是index.php
        try_files $uri $uri/ /controller.php?_url=$uri&$args;    #同理修改成controller.php

    }   
    
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }   
 
    location ~\.php$ {
    
        root           /path/to/ueditor;    #UEditor專案目錄
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }     
	
    location ~ /\.ht {
        deny  all;
    }
}

這個時候,嘗試去訪問http://127.0.0.1:8888/controller.php?action=config, 就會打印出如下引數了:


看到這個也就證明跳轉沒有問題了。接下來就是配置相應的路徑了。

3.上傳下載路徑配置

開啟引數檔案config.json,主要需要修改以下引數:

"imageUrlPrefix": "http://<ip>/backend/image/download", /* 圖片訪問路徑字首 */
"imagePathFormat": "/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上傳儲存路徑,可以自定義儲存路徑和檔名格式 */
"imageManagerUrlPrefix": "http://<ip>/backend/image/download", /* 圖片訪問路徑字首 */

這裡的imagePathFormat是儲存圖片路徑的後半部分,以上述例子,全路徑將會是:

<UEditor專案路徑>/image/

然後是圖片下載路徑,imageUrlPrefix和imageManagerUrlPrefix, 前者是圖片下載的URL字首,後者是,這裡注意UEditor自帶的後端專案對於檔案下載訪問並不是很友好。(事實其實是,筆者鼓搗老半天,都沒找到門路。。。閉嘴

所以下一步,筆者選擇了自己編寫檔案下載訪問介面。

4.檔案下載介面編寫

由於筆者使用的是phalcon框架,所以路由定義就不放了,大家根據自己的框架去定義,這裡我附上我寫的Action:

public function ueditorAction(){
        //由於UEDITOR前端請求的URL最終格式是http://<ip>/backend/image/download/image/20180926/4252485345154.jpg?noCache=jj5b74xn
     //所以需要擷取url中的檔案路徑資訊,這裡使用了正則匹配
        $res = preg_match("/[0-9]{8}\/[0-9]*\.jpg/", $_SERVER['REQUEST_URI'], $match);
        if($res <= 0){
            return $this->return404();
        }
        $file = $match[0];
        $file_path = UEDITOR_FILE_PATH.$file;    //真實全路徑資訊,UEDITOR_FILE_PATH為真實路徑字首

        $extension = preg_split('/\./',$file)[1];
        if($extension == 'jpg'){
            $extension = 'jpeg';
        }
        $fp=fopen($file_path,"r");
        $file_size=filesize($file_path);

        Header("Content-type: image/".$extension);
        Header("Accept-Ranges: bytes");
        Header("Accept-Length:".$file_size);
        Header("Content-Disposition: attachment; filename=".$file);

        Header("Access-Control-Allow-Origin:*");
        Header('Access-Control-Allow-Methods:GET, POST, PATCH, PUT, OPTIONS');
        Header("Access-Control-Allow-Headers:x-requested-with,content-type");
        $buffer=1024;
        $file_count=0;

        while(!feof($fp) && $file_count<$file_size){
            $file_con=fread($fp,$buffer);
            $file_count+=$buffer;
            echo $file_con;
        }
        fclose($fp);

        exit;
    }

5.還有幾個小問題

出現跨域header問題,嘗試在controller.php中新增:

header("Access-Control-Allow-Origin:*");
header('Access-Control-Allow-Methods:GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: X-Requested-With,X_Requested_With'); //設定允許的跨域header

出現錯誤資訊返回異常,修改所有的json_encode如下:

json_encode(array(
            'state'=> 'callback引數不合法'
        ), JSON_UNESCAPED_UNICODE);