在node环境下配置ueditor图片上传

ueditor.png

官网没有提供node版本,在node环境下使用时,虽然基础功能不会受到影响,但是在node中实现图片上传功能,需要进行一些设置才能够生效。

比如配置项:imagePathFormat:/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}

这个配置项要实现的功能是:指定上传图片时的路径,且该路径会根据时间自动创建文件夹,参数介绍了format的自动性和美妙实现,但是这个是需要基于后端来实现的,由于官网中没有指出,容易在使用中迷惑。

要实现node环境下的图片上传,需要以下几个步骤。

1.配置config.json:

在前端文件中配置一个config.json,放到ueditor目录下就可以。这个config.json的内容官网上有提供,我把我使用的给粘过来。

{
    "imageActionName": "uploadimage",
    "imageFieldName": "upfile",
    "imageMaxSize": 2048000,
    "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"],
    "imageCompressEnable": true,
    "imageCompressBorder": 1600,
    "imageInsertAlign": "none",
    "imageUrlPrefix": "",
    "imagePathFormat": "/upload/ueditor/pic/",
    "scrawlActionName": "uploadscrawl",
    "scrawlFieldName": "upfile",
    "scrawlPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
    "scrawlMaxSize": 2048000,
    "scrawlUrlPrefix": "",
    "scrawlInsertAlign": "none",
    "snapscreenActionName": "uploadimage",
    "snapscreenPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
    "snapscreenUrlPrefix": "",
    "snapscreenInsertAlign": "none",
    "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"],
    "catcherActionName": "catchimage",
    "catcherFieldName": "source",
    "catcherPathFormat": "/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}",
    "catcherUrlPrefix": "",
    "catcherMaxSize": 2048000,
    "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"],
    "videoActionName": "uploadvideo",
    "videoFieldName": "upfile",
    "videoPathFormat": "/ueditor/php/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}",
    "videoUrlPrefix": "",
    "videoMaxSize": 102400000,
    "videoAllowFiles": [
        ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
        ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"],
    "fileActionName": "uploadfile",
    "fileFieldName": "upfile",
    "filePathFormat": "/ueditor/php/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}",
    "fileUrlPrefix": "",
    "fileMaxSize": 51200000,
    "fileAllowFiles": [
        ".png", ".jpg", ".jpeg", ".gif", ".bmp",
        ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
        ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
        ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
        ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
    ],
    "imageManagerActionName": "listimage",
    "imageManagerListPath": "/ueditor/php/upload/image/",
    "imageManagerListSize": 20,
    "imageManagerUrlPrefix": "",
    "imageManagerInsertAlign": "none",
    "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"],
    "fileManagerActionName": "listfile",
    "fileManagerListPath": "/ueditor/php/upload/file/",
    "fileManagerUrlPrefix": "",
    "fileManagerListSize": 20,
    "fileManagerAllowFiles": [
        ".png", ".jpg", ".jpeg", ".gif", ".bmp",
        ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",
        ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",
        ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
        ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml"
    ]
}

2.实现请求config.json的方法:

请求的路径,以使用我站点的地址进行一个示例,应该一看就明白了。

路径示例:http://www.lovejavascript.com/ueditor?action=config&&noCache=1472380163761

没错,这个链接所请求到的正是步骤一中所配置的config.json。

不过有些不理解为什么config需要通过ajax去动态获取,而且找不到配置这个ajax的地方。

下面是在ueditor中发起请求的源码:

/**
 * 根据action名称获取请求的路径
 * @method  getActionUrl
 * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径
 * @param { String } action action名称
 * @example
 * ```javascript
 * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config"
 * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage"
 * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl"
 * editor.getActionUrl('imageManager'); //返回 "/ueditor/php/controller.php?action=listimage"
 * 
 */
getActionUrl: function(action){
    var actionName = this.getOpt(action) || action,
        imageUrl = this.getOpt('imageUrl'),
        serverUrl = this.getOpt('serverUrl');
    if(!serverUrl && imageUrl) {
        serverUrl = imageUrl.replace(/^(.*[/]).+([.].+)$/, '$1controller$2');
    }
    if(serverUrl) {
        serverUrl = serverUrl + (serverUrl.indexOf('?') == -1 ? '?':'&') + 'action=' + (actionName || '');
        return utils.formatUrl(serverUrl);
    } else {
        return '';
    }
}

源代码看一下就好,具体要做的其实就是下面这一些代码,在nodejs中接收config请求,并将config.json返回:

// 获取配置文件
var ueditorConfig = require('../ueditor.config.json');//公共方法
config: function (req, res) {
    res.writeHead(200, {"Content-Type": "text/json"});
    res.write(JSON.stringify(ueditorConfig));
    res.end();
}

3.接收图片上传请求

上面config.json中的参数[imageActionName:'uploadimage']就是用来设定图片上传的请求地址。根据这个地址,进行上传文件操作的编码就可以了。代码如下:

// 上传图片
uploadimage: function (req, res) {
    var form = new formidable.IncomingForm();
    var picPath = ueditorConfig['imagePathFormat'] + new Date().format('YYYYMMDD') + '/';
    _common_.existsSyncPath('.' + picPath);
    //设定上传文件路径
    form.parse(req, function(error,fields,files){
        var image = files[ueditorConfig.imageFieldName];
        var fileName = image.name,
            fileType = fileName.substring(fileName.lastIndexOf('.'), fileName.length).toLowerCase(),
            newFilename = new Date().valueOf() + fileType;
        var readStream = fs.createReadStream(image.path),
            writeStream = fs.createWriteStream('.' + picPath + newFilename);
        readStream.pipe(writeStream);
        readStream.on('end',function(){
            fs.unlinkSync(image.path);
        });
        var json ={
            "originalName": fileName,
            "name": newFilename,
            "url": picPath + newFilename,
            "type": fileType,
            "size": image.length,
            "state": "SUCCESS"
        };
        res.writeHead(200, {"Content-Type": "text/json"});
        res.write(JSON.stringify(json));
        res.end();
    });
}

需要注意的是后端接收图片的方式是:formData,且成功后需要按下面规则返回:

JSON.stringify({
    "originalName": filename,
    "name": newFilename,
    "url": '/uploads/' + newFilename,
    "type": ext,
    "size": filesize,
    "state": "SUCCESS"
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容