Skip to content

Instantly share code, notes, and snippets.

@huanggm
Created April 15, 2017 07:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save huanggm/79c48ea60e74c836aae4fc1c4924a0f4 to your computer and use it in GitHub Desktop.
Save huanggm/79c48ea60e74c836aae4fc1c4924a0f4 to your computer and use it in GitHub Desktop.
//重写UploadFile和xhrUploadImg
function changeGlobalUploadFilePrototype() {
if (!window.FileReader || !window.FormData) {
// 如果不支持html5的文档操作,直接返回
return;
}
var E = wangEditor;
wangEditor.UploadFile.fn.selected = function(e, input) {
var self = this;
var files = input.files || [];
if (files.length === 0) {
return;
}
$.each(files, function (key, value) {
value.randomId = E.random();
});
insertImagePlaceholder(files, self.editor);
$.each(files, function (key, value) {
self.upload(value);
});
}
wangEditor.UploadFile.fn.upload = function (file) {
var self = this;
var editor = self.editor;
var filename = file.name || '';
var fileType = file.type || '';
var uploadImgFns = editor.config.uploadImgFns;
var uploadFileName = editor.config.uploadImgFileName || 'wangEditorH5File';
var onload = uploadImgFns.onload;
var ontimeout = uploadImgFns.ontimeout;
var onerror = uploadImgFns.onerror;
var reader = new FileReader();
if (!onload || !ontimeout || !onerror) {
E.error('请为编辑器配置上传图片的 onload ontimeout onerror 回调事件');
return;
}
E.log('开始执行 ' + filename + ' 文件的上传');
// 清空 input 数据
function clearInput() {
self.clear();
}
// onload事件
reader.onload = function (e) {
E.log('已读取' + filename + '文件');
var base64 = e.target.result || this.result;
editor.xhrUploadImg({
event: e,
filename: filename,
randomId: file.randomId || '',
base64: base64,
fileType: fileType,
name: uploadFileName,
loadfn: function (resultText, xhr, extra) {
clearInput();
// 执行配置中的方法
var editor = this;
onload.call(editor, resultText, xhr, extra);
},
errorfn: function (xhr, extra) {
clearInput();
if (E.isOnWebsite) {
alert('wangEditor官网暂时没有服务端,因此报错。实际项目中不会发生');
}
// 执行配置中的方法
var editor = this;
onerror.call(editor, xhr, extra);
},
timeoutfn: function (xhr, extra) {
clearInput();
if (E.isOnWebsite) {
alert('wangEditor官网暂时没有服务端,因此超时。实际项目中不会发生');
}
// 执行配置中的方法
var editor = this;
ontimeout(editor, xhr, extra);
}
});
};
// 开始取文件
reader.readAsDataURL(file);
};
function insertImagePlaceholder(files, editor) {
var s = '';
$.each(files, function (key, value) {
s += '<img id="' + value.randomId + '" src="">'
});
editor.command(null, 'insertHtml', s);
}
}
function sequenceUploadImage(editor) {
if (!window.FileReader || !window.FormData) {
// 如果不支持html5的文档操作,直接返回
return;
}
var E = wangEditor;
(function() {
var config = editor.config;
var uploadImgUrl = config.uploadImgUrl;
var uploadTimeout = config.uploadTimeout;
// 获取配置中的上传事件
var uploadImgFns = config.uploadImgFns;
var onload = uploadImgFns.onload;
var ontimeout = uploadImgFns.ontimeout;
var onerror = uploadImgFns.onerror;
if (!uploadImgUrl) {
return;
}
// -------- 将以base64的图片url数据转换为Blob --------
function convertBase64UrlToBlob(urlData, filetype){
//去掉url的头,并转换为byte
var bytes = window.atob(urlData.split(',')[1]);
//处理异常,将ascii码小于0的转换为大于0
var ab = new ArrayBuffer(bytes.length);
var ia = new Uint8Array(ab);
var i;
for (i = 0; i < bytes.length; i++) {
ia[i] = bytes.charCodeAt(i);
}
return new Blob([ab], {type : filetype});
}
// -------- 插入图片的方法 --------
function insertImg(src, event) {
var img = document.createElement('img');
img.onload = function () {
var html = '<img src="' + src + '" style="max-width:100%;"/>';
editor.command(event, 'insertHtml', html);
E.log('已插入图片,地址 ' + src);
img = null;
};
img.onerror = function () {
E.error('使用返回的结果获取图片,发生错误。请确认以下结果是否正确:' + src);
img = null;
};
img.src = src;
}
// -------- onprogress 事件 --------
function updateProgress(e) {
if (e.lengthComputable) {
var percentComplete = e.loaded / e.total;
editor.showUploadProgress(percentComplete * 100);
}
}
// -------- xhr 上传图片 --------
editor.xhrUploadImg = function (opt) {
// opt 数据
var event = opt.event;
var fileName = opt.filename || '';
var randomId = opt.randomId || '';
var base64 = opt.base64;
var fileType = opt.fileType || 'image/png'; // 无扩展名则默认使用 png
var name = opt.name || 'wangEditor_upload_file';
var loadfn = opt.loadfn || onload;
var errorfn = opt.errorfn || onerror;
var timeoutfn = opt.timeoutfn || ontimeout;
// 上传参数(如 token)
var params = editor.config.uploadParams || {};
// headers
var headers = editor.config.uploadHeaders || {};
// 获取文件扩展名
var fileExt = 'png'; // 默认为 png
if (fileName.indexOf('.') > 0) {
// 原来的文件名有扩展名
fileExt = fileName.slice(fileName.lastIndexOf('.') - fileName.length + 1);
} else if (fileType.indexOf('/') > 0 && fileType.split('/')[1]) {
// 文件名没有扩展名,通过类型获取,如从 'image/png' 取 'png'
fileExt = fileType.split('/')[1];
}
// ------------ begin 预览模拟上传 ------------
if (E.isOnWebsite) {
E.log('预览模拟上传');
insertImg(base64, event);
return;
}
// ------------ end 预览模拟上传 ------------
// 变量声明
var xhr = new XMLHttpRequest();
var timeoutId;
var src;
var formData = new FormData();
// 超时处理
function timeoutCallback() {
if (timeoutId) {
clearTimeout(timeoutId);
}
if (xhr && xhr.abort) {
xhr.abort();
}
// 超时了就阻止默认行为
event.preventDefault();
// 执行回调函数,提示什么内容,都应该在回调函数中定义
timeoutfn && timeoutfn.call(editor, xhr, {
randomId: randomId
});
// 隐藏进度条
editor.hideUploadProgress();
}
xhr.onload = function () {
if (timeoutId) {
clearTimeout(timeoutId);
}
// 记录文件名到 editor.uploadImgOriginalName ,插入图片时,可做 alt 属性用
editor.uploadImgOriginalName = fileName;
if (fileName.indexOf('.') > 0) {
editor.uploadImgOriginalName = fileName.split('.')[0];
}
// 执行load函数,任何操作,都应该在load函数中定义
loadfn && loadfn.call(editor, xhr.responseText, xhr, {
randomId: randomId
});
// 隐藏进度条
editor.hideUploadProgress();
};
xhr.onerror = function () {
if (timeoutId) {
clearTimeout(timeoutId);
}
// 超时了就阻止默认行为
event.preventDefault();
// 执行error函数,错误提示,应该在error函数中定义
errorfn && errorfn.call(editor, xhr, {
randomId: randomId
});
// 隐藏进度条
editor.hideUploadProgress();
};
// xhr.onprogress = updateProgress;
xhr.upload.onprogress = updateProgress;
// 填充数据
formData.append(name, convertBase64UrlToBlob(base64, fileType), randomId + '.' + fileExt);
// 添加参数
$.each(params, function (key, value) {
formData.append(key, value);
});
// 开始上传
xhr.open('POST', uploadImgUrl, true);
// xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // 将参数解析成传统form的方式上传
// 修改自定义配置的headers
$.each(headers, function (key, value) {
xhr.setRequestHeader(key, value);
});
// 跨域上传时,传cookie
xhr.withCredentials = editor.config.withCredentials || true;
// 发送数据
xhr.send(formData);
timeoutId = setTimeout(timeoutCallback, uploadTimeout);
E.log('开始上传...并开始超时计算');
};
})();
(function() {
var txt = editor.txt;
var $txt = txt.$txt;
var config = editor.config;
var uploadImgUrl = config.uploadImgUrl;
var uploadFileName = config.uploadImgFileName || 'wangEditorDragFile';
// 未配置上传图片url,则忽略
if (!uploadImgUrl) {
return;
}
//清除已有的事件
$txt.off('drop').off('paste').on('drop', function(e) {
e.preventDefault();
bootbox.alert('暂不支持拖拽图片');
}).on('paste', function(e) {
e.preventDefault();
bootbox.alert('暂不支持粘贴文本');
});
})();
}
@huanggm
Copy link
Author

huanggm commented Apr 15, 2017

主要是这两个方法:
changeGlobalUploadFilePrototype
sequenceUploadImage

changeGlobalUploadFilePrototype这个方法是改变wangEditor.UploadFile的prototype,所以只需要调用一次。
sequenceUploadImage这个方法需要传入一个editor实例对象。

缺点是:目前只支持了,点击按钮选中图片,对于拖拽上传和粘贴复制上传没有支持

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment