koa-ueditor上傳圖片到七牛


  問題描述:服務器系統架構采用的是koa(並非koa2),客戶端富文本編輯器采用的是百度的ueditor控件。現在需要ueditor支持將圖片直接上傳到七牛雲

  前提:百度的ueditor需要在本地配置為可用,圖片上傳相關的配置可以參考官方文檔的描述。由於服務器用的node.js,因此ueditor目錄下我們只需要保留nodejs目錄,其它部分如php,asp.net等都可以刪掉。然后根據自己服務器的環境適當修改config.json文件中的配置。

  現有方案:現有npm和github上找到的庫有很多是基於koa2的,並非koa,所以不適用於本場景。找到一個koa-ueditor的庫,但只是將圖片上傳到服務器硬盤,缺少將圖片上傳到七牛雲,當然我們可以補充這部分代碼,畢竟七牛也提供了相應的接口從服務器硬盤將圖片進行上傳。另外還有一個庫oeditor,相對來說比較老了,嘗試了一下,並不能正常工作,在debug的過程中發現無法獲取到圖片文件的數據,原因可能是因為在koa的框架中需要配合使用co-busboy

  解決方案:嘗試對koa-ueditor庫進行改造,使其支持將圖片上傳到七牛。

  我們將上傳的方法封裝成一個中間件,代碼如下:

"use strict";
var Q = require('q');
var path = require("path");
var os = require('os');
var snowflake = require('node-snowflake').Snowflake;
var qn = require('qn');
var parse = require('co-busboy');
var Rst = require('huanche-models').rst;
var img_type = '.jpg .png .gif .ico .bmp .jpeg';
var img_path = '/ueditor/upload';

var Config = {};

function* ueditor(next){
    if (this.query.action === 'config') {
        this.set("Content-Type","json");
        this.redirect("/ueditor/nodejs/config.json");
    }
    else if(this.query.action === 'uploadimage' || this.query.action === 'uploadfile'){
        if (!Config.qn) {
            throw (new Rst()).error('缺少qiniu配置');
        }
        var parts = parse(this);
        var part;
        // var stream;
        var tmp_name;
        var file_path;
        var filename;
        var deferred = Q.defer();
        while (part = yield parts) {
            if (part.length) {
                // fields are returned as arrays
                var key = part[0];
                var value = part[1];
                // check the CSRF token
                //if (key === '_csrf') this.assertCSRF(value);
            } else {
                // files are returned as readable streams
                // let's just save them to disk

                if(this.query.action === 'uploadimage' && img_type.indexOf(path.extname(part.filename)) >= 0 ){
                    var tmpdir = path.join(os.tmpdir(), path.basename(part.filename));
                    filename = snowflake.nextId() + path.extname(tmpdir);
                    file_path = path.join(img_path, filename);
                    tmp_name = part.filename;

                    qn.create(Config.qn).upload(part, {
                        key: 'ueditor/images/' + filename
                    }, function (err, results) {
                        if (err) deferred.reject(err);
                        deferred.resolve(results);
                    });
                }
            }
        }

        var rst = yield deferred.promise.then(function (result) {
            // console.log(result);
            return result;
        });
        this.body = {
            'url': rst.url,
            'title': filename,
            'original': tmp_name,
            'state': 'SUCCESS'
        };
    }else{
        this.body = {
            'state': 'FAIL'
        };
    }
    yield next;
}

module.exports = function(config){
    if(config){
        Config = config;
    }
    return ueditor;
};

  然后定義圖片上傳的路由,並指定七牛相關的參數配置。

const router = require('koa-router')();
const ueditor_qiniu = require('../../middleware/koa_ueditor_upload_qiniu');

router.all('/ueditor/ue', ueditor_qiniu({
    qn: {
        accessKey: 'xxxxxxxxxxx', // 七牛的accessKey
        secretKey: 'xxxxxxxxxxx', // 七牛的secretKey
        bucket: 'imgpub', // bucket
        origin: 'https://xxx.xxxx.com' // origin url
    }
}));

module.exports = router;

  注意路由定義中的url部分,這個需要和ueditor目錄下的ueditor.config.js文件中所配置的serverUrl參數的值保持一致,否則運行時ueditor將無法正確訪問路由。同時我們還需要正確指定七牛上傳圖片相關的參數,傳給中間件的函數。

  采用這種方式不需要指定服務器上的圖片上傳路徑,所有上傳的圖片會直接上傳到七牛雲,然后返回七牛的圖片地址給ueditor控件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM