Examples

File upload handler

Write your owner UI and upload handler

Demo Code:

<link rel="stylesheet" href="/richtexteditor/rte_theme_default.css" />
<script type="text/javascript" src="/richtexteditor/rte.js"></script>
<script type="text/javascript" src='/richtexteditor/plugins/all_plugins.js'></script>

<div id="div_editor1"></div>

<script>

	var config = {};

	config.file_upload_handler = function (file, callback, optionalIndex, optionalFiles) {
		var uploadhandlerpath = "/imageupload.ashx";

		console.log("upload", file, "to", uploadhandlerpath)

		function append(parent, tagname, csstext) {
			var tag = parent.ownerDocument.createElement(tagname);
			if (csstext) tag.style.cssText = csstext;
			parent.appendChild(tag);
			return tag;
		}

		var uploadcancelled = false;

		var dialogouter = append(document.body, "div", "display:flex;align-items:center;justify-content:center;z-index:999999;position:fixed;left:0px;top:0px;width:100%;height:100%;background-color:rgba(128,128,128,0.5)");
		var dialoginner = append(dialogouter, "div", "background-color:white;border:solid 1px gray;border-radius:15px;padding:15px;min-width:200px;box-shadow:2px 2px 6px #7777");

		var line1 = append(dialoginner, "div", "text-align:center;font-size:1.2em;margin:0.5em;");
		line1.innerText = "Uploading...";

		var totalsize = file.size;
		var sentsize = 0;

		if (optionalFiles && optionalFiles.length > 1) {
			totalsize = 0;
			for (var i = 0; i < optionalFiles.length; i++) {
				totalsize += optionalFiles[i].size;
				if (i < optionalIndex) sentsize = totalsize;
			}
			console.log(totalsize, optionalIndex, optionalFiles)
			line1.innerText = "Uploading..." + (optionalIndex + 1) + "/" + optionalFiles.length;
		}

		var line2 = append(dialoginner, "div", "text-align:center;font-size:1.0em;margin:0.5em;");
		line2.innerText = "0%";

		var progressbar = append(dialoginner, "div", "border:solid 1px gray;margin:0.5em;");
		var progressbg = append(progressbar, "div", "height:12px");

		var line3 = append(dialoginner, "div", "text-align:center;font-size:1.0em;margin:0.5em;");
		var btn = append(line3, "button");
		btn.className = "btn btn-primary";
		btn.innerText = "cancel";
		btn.onclick = function () {
			uploadcancelled = true;
			xh.abort();
		}

		var xh = new XMLHttpRequest();
		xh.open("POST", uploadhandlerpath + "?name=" + encodeURIComponent(file.name) + "&type=" + encodeURIComponent(file.type) + "&size=" + file.size, true);
		xh.onload = xh.onabort = xh.onerror = function (pe) {
			console.log(pe);
			console.log(xh);
			dialogouter.parentNode.removeChild(dialogouter);
			if (pe.type == "load") {
				if (xh.status != 200) {
					console.log("uploaderror", pe);
					if (xh.responseText.startsWith("ERROR:")) {
						callback(null, "http-error-" + xh.responseText.substring(6));
					}
					else {
						callback(null, "http-error-" + xh.status);
					}
				}
				else if (xh.responseText.startsWith("READY:")) {
					console.log("File uploaded to " + xh.responseText.substring(6));
					callback(xh.responseText.substring(6));
				}
				else {
					callback(null, "http-error-" + xh.responseText);
				}
			}
			else if (uploadcancelled) {
				console.log("uploadcancelled", pe);
				callback(null, "cancelled");
			}
			else {
				console.log("uploaderror", pe);
				callback(null, pe.type);
			}
		}
		xh.upload.onprogress = function (pe) {
			console.log(pe);
			//pe.total
			var percent = Math.floor(100 * (sentsize + pe.loaded) / totalsize);
			line2.innerText = percent + "%";

			progressbg.style.cssText = "background-color:green;width:" + (percent * progressbar.offsetWidth / 100) + "px;height:12px;";
		}
		xh.send(file);
	}

	var editor1 = new RichTextEditor("#div_editor1", config);
</script>