问题描述:服务器系统架构采用的是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控件。

koa-ueditor上传图片到七牛的更多相关文章

  1. UEditor上传图片到七牛C#(后端实现)

    由于个人网站空间存储有所以选择将图片统一存储到七牛上,理由很简单 1  免费10G 的容量  ,对个人网站足够用 2  规范的开发者文档 和完善的sdk(几乎所有热门语言sdk) 整体思路 图片上传七 ...

  2. UEditor上传图片到七牛云储存(java)

    我们的网站一般放在虚拟空间或者服务器上,图片如果存在本地目录,会占用很多空间和流量,还增加了负担,好的办法是把图片存放到云储存服务里面,平时用url去拿 云储存:普遍说又拍云和七牛比较好,看到七牛免费 ...

  3. UEditor上传图片到七牛云储存(c#)

    我们的网站一般放在虚拟空间或者服务器上,图片如果存在本地目录,会占用很多空间和流量,还增加了负担,好的办法是把图片存放到云储存服务里面,平时用url去拿 云储存:普遍说又拍云和七牛比较好,看到七牛免费 ...

  4. ueditor上传图片到七牛云存储(form api,java)

    转:http://my.oschina.net/duoduo3369/blog/174655 ueditor上传图片到七牛云存储 ueditor结合七牛传图片 七牛的试炼 开发前的准备与注意事项说明 ...

  5. axios上传图片(及vue上传图片到七牛))

    浏览器上传图片到服务端,我用过两种方法: 1.本地图片转换成base64,然后通过普通的post请求发送到服务端. 操作简单,适合小图,以及如果想兼容低版本的ie没办法用此方法 2.通过form表单提 ...

  6. node+express上传图片到七牛

    本人微信公众号:前端修炼之路,欢迎关注 最近做项目的时候有一个上传图片的需求,由于没有后端的配合,所以决定自己来搭个服务器,实现上传图片功能.以后如果需要修改成java或者php为后端,直接使用即可, ...

  7. 使用微信 SDK 上传图片到七牛

    总体思路是:在微信下选好图片后将图片上传到微信服务器,在后端使用微信服务器返回的图片 serverId 加上调用接口的 ApiTicket 通过七牛的 fetch 接口向微信服务器下载多媒体文件的接口 ...

  8. JAVA简单上传图片至七牛

    utils package com.example.demo.utils; import com.alibaba.fastjson.JSONObject; import com.qiniu.commo ...

  9. vue项目中使用element ui上传图片到七牛

    1.获取token值 后台有接口调用直接返回token值 //请求后台拿七牛云token async getQiniuToken() { //token let uploadtoken = await ...

随机推荐

  1. Mysql使用中文字段排序的实现--order by

    在处理排序规则的时候,有时候我们会需要选择用一些中文字段来排序,实现我们在工作中的需求,下面是在处理排序的时候,适用的方式展示. SELECT t.lawcheckcolumnid AS id,t.c ...

  2. git客户端保存用户名密码

    [转载]原文地址:https://blog.csdn.net/qq_26819733/article/details/52735123/ 看图说话,直接在Tortoisegit的设置中,点git-&g ...

  3. 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...

  4. mybatis-generator : 自动生成代码

    [参考文章]:mybatis generator自动生成代码时 只生成了insert 而没有其他 [参考文章]:Mybatis Generator最完整配置详解 1. pom <plugin&g ...

  5. python接口自动化(七)--状态码详解对照表(详解)

    简介 我们为啥要了解状态码,从它的作用,就不言而喻了.如果不了解,我们就会像个无头苍蝇,横冲直撞.遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师. 状态码的作用是:we ...

  6. Android 8.0系统的应用图标适配

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 参考资料<一起来学习Android 8.0系统的应用图标适配吧>中已经讲得很清楚了,这里我只是简单总结下.详情的内容请阅 ...

  7. 博主新建Linux学习交流群,欢迎广大大神入驻~

    一转眼2018已经过去,博主在博客园辛勤耕耘了1年多,也结识了很多志同道合的道友: 收获了“基”情满满的友谊的同时,也大大拓宽了自己的眼界~ 深深感到在漫漫的学习之路,需要有道友一同共勉和相互激励! ...

  8. Prism定制Region控件

    并不是所有控件都可以被用作Region了吗?我们将Gird块的代码变成这样: <Grid> <ContentControl prism:RegionManager.RegionNam ...

  9. 【Oracle学习笔记】定时任务(dbms_job)

    一.概述 Oralce中的任务有2种:Job和Dbms_job,两者的区别有: 1.  jobs是oracle数据库的对象, dbms_jobs只是jobs对象的一个实例, 就像对于tables, e ...

  10. MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 18) --为什么这些SQL语句逻辑相同,性能却差异巨大? 本篇我们以三 ...