zoukankan      html  css  js  c++  java
  • 富文本编辑器

    效果:

    项目结构图:

    wangEditor-upload-img.html代码:

    <html>
    	<head>
    		<title>wangEditor-图片上传</title>
    		<link rel="stylesheet" href="wangEditor/css/wangEditor-1.3.0.min.css">
    		
    		<style type="text/css">
    			.wrap{
    				margin:30px 30px 0 30px;
    			}
    			#txt_wangEditor{
    				100%;
    				height:300px;
    			}
    		</style>
    	</head>
    	<body>
    		<!--上传-->
    		<div id="uploadContainer">
    			<input type="button" value="选择文件" id="btnBrowse"/>
    			<input type="button" value="上传文件" id="btnUpload">
    			<ul id="fileList"></ul>
    		</div>
    		<!--富文本编辑器-->
    		<div class="wrap">
    			<textarea id="txt_wangEditor"></textarea>
    			<input type="button" id="submit" value="获取内容">
    		</div>
    
    		
    		
    		<!-- JQuery -->
    		<script type="text/javascript" src="js/jquery-1.10.2.min.js"></script>
    		<!-- wangEditor-富文本编辑器 -->
    		<script type="text/javascript" src="wangEditor/js/wangEditor-1.3.5.min.js"></script>
    		<!-- plupload-上传组件 -->
    		<script type="text/javascript" src="plupload/plupload.full.min.js"></script>
    		<!-- js -->
    		<script type="text/javascript">
    			$(document).ready(function(){
    				//获取dom节点
    				var $uploadContainer = $('#uploadContainer'),
    						$fileList = $('#fileList'),
    						$btnUpload = $('#btnUpload');
    
    				//实例化富文本编辑器
    				var editor = $('#txt_wangEditor').wangEditor({
    					//重要:传入 uploadImgComponent 参数,值为 $uploadContainer
    					uploadImgComponent: $uploadContainer,
    					//表情
    					 'expressions':geticon()
    				});
    
    				//实例化一个上传对象
    				var uploader = new plupload.Uploader({
    					browse_button: 'btnBrowse',
    					url: 'upload.php', 
    					flash_swf_url: 'plupload/Moxie.swf',
    					sliverlight_xap_url: 'plupload/Moxie.xap',
    					filters: {
    								mime_types: [
    								  //只允许上传图片文件 (注意,extensions中,逗号后面不要加空格)
    								  { title: "图片文件", extensions: "jpg,gif,png,bmp" }
    								]
    						}
    				});
    
    				//存储多个图片的url地址
    				var urls = [];
    
    				//重要:定义 event 变量,会在下文(触发上传事件时)被赋值
    				var event;
    
    				//初始化
    				uploader.init();
    
    				//绑定文件添加到队列的事件
    				uploader.bind('FilesAdded', function (uploader, files) {
    						//显示添加进来的文件名
    					$.each(files, function(key, value){
    						var fileName = value.name,
    							html = '<li>' + fileName + '</li>';
    						$fileList.append(html);
    					});
    				});
    
    				//单个文件上传之后
    				uploader.bind('FileUploaded', function (uploader, file, responseObject) {
    						//从服务器返回图片url地址
    					var url = responseObject.response;
    						//先将url地址存储来,待所有图片都上传完了,再统一处理
    					urls.push(url);
    					});
    
    					//全部文件上传时候
    				uploader.bind('UploadComplete', function (uploader, files) {
    					// 用 try catch 兼容IE低版本的异常情况
    					try {
    						//打印出所有图片的url地址
    						$.each(urls, function (key, value) {
    							//重要:调用 editor.command 方法,把每一个图片的url,都插入到编辑器中
    							//重要:此处的 event 即上文定义的 event 变量
    							editor.command(event, 'insertHTML', '<img src="' + value + '"/>');
    						});
    					} catch (ex) {
    						// 此处可不写代码
    					} finally {
    						//清空url数组
    						urls = [];
    
    						//清空显示列表
    						$fileList.html('');
    					}
    				});
    
    				//上传事件
    				$btnUpload.click(function(e){
    					//重要:将事件参数 e 赋值给 上文定义的 event 变量
    					event = e;
    					uploader.start();
    				});
    			
    			})
    		</script>
    	</body>
    </html>
    

    upload.php代码:

    <?php
    	$targetDir = 'upload_tmp';
    	$uploadDir = 'upload';
    
    	$cleanupTargetDir = true; 
    
    
    	if (!file_exists($targetDir)) {
    		@mkdir($targetDir);
    	}
    
    	if (!file_exists($uploadDir)) {
    		@mkdir($uploadDir);
    	}
    
    	if (isset($_REQUEST["name"])) {
    		$fileName = $_REQUEST["name"];
    	} elseif (!empty($_FILES)) {
    		$fileName = $_FILES["file"]["name"];
    	} else {
    		$fileName = uniqid("file_");
    	}
    	$fileName = iconv('UTF-8', 'GB2312', $fileName);
    	$filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;
    	$uploadPath = $uploadDir . DIRECTORY_SEPARATOR . $fileName;
    
    
    	$imgUrl="http://localhost:8088/FileUpload/".$uploadDir."/".$fileName;
    	echo $imgUrl;
    
    	$chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
    	$chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 1;
    
    
    	if ($cleanupTargetDir) {
    		if (!is_dir($targetDir) || !$dir = opendir($targetDir)) {
    			die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');
    		}
    
    		while (($file = readdir($dir)) !== false) {
    			$tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file;
    
    			if ($tmpfilePath == "{$filePath}_{$chunk}.part" || $tmpfilePath == "{$filePath}_{$chunk}.parttmp") {
    				continue;
    			}
    
    			if (preg_match('/.(part|parttmp)$/', $file) && (@filemtime($tmpfilePath) < time() - $maxFileAge)) {
    				@unlink($tmpfilePath);
    			}
    		}
    		closedir($dir);
    	}
    
    
    
    	if (!$out = @fopen("{$filePath}_{$chunk}.parttmp", "wb")) {
    		die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
    	}
    
    	if (!empty($_FILES)) {
    		if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) {
    			die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
    		}
    
    		if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) {
    			die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
    		}
    	} else {
    		if (!$in = @fopen("php://input", "rb")) {
    			die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
    		}
    	}
    
    	while ($buff = fread($in, 4096)) {
    		fwrite($out, $buff);
    	}
    
    	@fclose($out);
    	@fclose($in);
    
    	rename("{$filePath}_{$chunk}.parttmp", "{$filePath}_{$chunk}.part");
    
    	$index = 0;
    	$done = true;
    	for( $index = 0; $index < $chunks; $index++ ) {
    		if ( !file_exists("{$filePath}_{$index}.part") ) {
    			$done = false;
    			break;
    		}
    	}
    	if ( $done ) {
    		if (!$out = @fopen($uploadPath, "wb")) {
    			die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
    		}
    
    		if ( flock($out, LOCK_EX) ) {
    			for( $index = 0; $index < $chunks; $index++ ) {
    				if (!$in = @fopen("{$filePath}_{$index}.part", "rb")) {
    					break;
    				}
    
    				while ($buff = fread($in, 4096)) {
    					fwrite($out, $buff);
    				}
    
    				@fclose($in);
    				@unlink("{$filePath}_{$index}.part");
    			}
    
    			flock($out, LOCK_UN);
    		}
    		@fclose($out);
    	}
    

    原版视频及其源码:http://www.kancloud.cn/wangfupeng/wangeditor/65747

  • 相关阅读:
    趣味算法:国王和100个囚犯(据说是腾讯的面试题)
    限制文本框的输入(兼容FF,IE)
    切换家里和公司网络的脚本
    onchange,onpropertychange,oninput的使用
    正则匹配html标记
    javascript清空数组的三种方法
    正则查找重复
    (正则)提取页面里的img标签
    javascript类型检测(转载)
    查看sqlserver信息
  • 原文地址:https://www.cnblogs.com/KTblog/p/5137296.html
Copyright © 2011-2022 走看看