美文网首页让前端飞Web前端之路Web 前端开发
在node环境下配置ueditor图片上传

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

作者: 前端沐先生 | 来源:发表于2017-04-11 11:30 被阅读821次
    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"
    })
    

    相关文章

      网友评论

        本文标题:在node环境下配置ueditor图片上传

        本文链接:https://www.haomeiwen.com/subject/gwpyattx.html