HTML5学习之FileReader接口【上传图片预览,拖拽上传】

 

关于JQuery上传图片input file change 事件只触发一次问题:

$(document).on('change onpropertychange',"#imgUrl", function() { //文件上传
			     var file = this.files[0];  
			     console.log(file);
                 if((file.size / 1024).toFixed(0)>300){
                 	$.alert({
					    title: '提示!',
						content: "图片大小为:"+(file.size / 1024).toFixed(0)+"kb,要求不能大于300kb",
					    confirm: function(){
					        
					    }
				    });
					return;
                 };
                 //读取图片数据
                 var reader = new FileReader();
                 reader.onload = function (e) {
                     var data = e.target.result;
                     //加载图片获取图片真实宽度和高度
                     var image = new Image();
                     image.onload=function(){
                         var width = image.width;
                         var height = image.height;
                         if(width=="590"&&height=="824"){
                         	  postFile();
                         	  $('#imgUrl').replaceWith('<input id="imgUrl" class="postfile" type="file" multiple="multiple">');
                         }else{
                         	$.alert({
							    title: '提示!',
								content: "图片宽高不符合590*824!",
							    confirm: function(){
							        
							    }
						    });
						    $('#imgUrl').replaceWith('<input id="imgUrl" class="postfile" type="file" multiple="multiple">');
                         }
                     };
                     image.src= data;
                 };
                 reader.readAsDataURL(file);
                 
			});
复制代码
$(document).on('change onpropertychange', "#postfile",function() { //这里要用事件委派b	 
	$(".poststate").text("请选择上传以.txt后缀结尾的文本文件!").css("color", "blue");
	postFile();
	$('#postfile').replaceWith('<input id="postfile" type="file" accept="text/plain" multiple="multiple" />');
});
复制代码
function postFile() { //判断是否有选择上传文件
			var imgPath = $("#postfile").val();
			if(imgPath == "") {
				$(".poststate").text("请选择上传的文本文件,以.txt后缀结尾!").css("color", "blue");
				return;
			}

			var strExtension = imgPath.substr(imgPath.lastIndexOf('.') + 1); //判断上传文件的后缀名
			if(strExtension != 'txt') {
				$(".poststate").text("请选择上传的文本文件,以.txt后缀结尾!").css("color", "blue");
				return;
			}
			var formData = new FormData();
			formData.append("file", $("#postfile")[0].files[0]);
			//console.log(postfile.files[0]);
			$.ajax({
				contentType: "multipart/form-data",
				url: "xxxx/xxxxx/xx",
				type: "POST",
				data: formData,
				dataType: "text",
				processData: false,
				contentType: false,
				cache: false,
				beforeSend: function() {
					$(".poststate").text("正在努力上传中,请稍后!").css("color", "blue");
				},
				success: function(data) {
					var reObj = JSON.parse(data);
					if(reObj.status=="0"){
						 
						if(reObj.content) {
							$.alert({
								title: '提示:',
								backgroundDismiss: true, 
								content: '上传文件成功!'
						    });
							$(".poststate").text('"' + reObj.content.fileName + '"' + "上传成功!").css("color", "blue");
							PostObj.pubS3FileUrl = reObj.content.url;
						}else {
							$.alert({
								title: '提示:',
								backgroundDismiss: true,
								content:  reObj.message
							});
							$(".poststate").text("");
						}
					}else{
						PostObj.pubS3FileUrl="";
						$.alert({
								title: '提示:',
								backgroundDismiss: true,
								content:  reObj.message
							});
							$(".poststate").text(reObj.message);
					    }
				},
				error: function(XMLHttpRequest, textStatus, errorThrown) {
					$(".poststate").text("上传失败,请检查网络后重试!").css("color", "red");;
				    
				}
			});
		}
复制代码


用来把文件读入内存,并且读取文件中的数据。FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据。到目前文职,只有FF3.6+和Chrome6.0+实现了FileReader接口。

1、FileReader接口的方法

FileReader接口有4个方法,其中3个用来读取文件,另一个用来中断读取。无论读取成功或失败,方法并不会返回读取结果,这一结果存储在result属性中。

方法名 参数描述
readAsBinaryStringfile将文件读取为二进制编码
readAsTextfile,[encoding]将文件读取为文本
readAsDataURLfile将文件读取为DataURL
abort(none)终端读取操作

2、FileReader接口事件

FileReader接口包含了一套完整的事件模型,用于捕获读取文件时的状态。

事件描述
onabort中断
onerror出错
onloadstart开始
onprogress正在读取
onload成功读取
onloadend读取完成,无论成功失败


上传图片预览:

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			* {
				padding: 0;
				margin: 0;
			}
			
			.container {
				width: 800px;
				margin: 100px auto;
			}
			
			.imgs {
				width: 300px;
				height: 300px;
			}
			
			.imgs img {
				width: 100%;
			}
		</style>
	</head>

	<body>
		<div class="container">
			<input type="file" name="file" id="file" value="上传" />
			<div class="imgs">
				<img id="preImg" src="" />
			</div>
			<div class="imgs">
				<img id="preImg1" src="" />
			</div>
			<div class="imgs">
				<img id="preImg2" src="" />
			</div>
			<div class="imgs">
				<img id="preImg3" src="" />
			</div>
		</div>
		<script type="text/javascript">
			var fe = document.getElementById("file");
			var img = document.getElementById("preImg");
			var img1 = document.getElementById("preImg1");
			var img2 = document.getElementById("preImg2");
			var img3 = document.getElementById("preImg3");
			fe.onchange = function() {
				var reader = new FileReader();
				var _file = this.files[0];
				console.log("reader");
				console.log(reader);
				//  建议去输出下这3个东西 仔细看看就明白了
				console.log("this.files");
				console.log(this.files);
				console.log("_file");
				console.log(_file);
				reader.readAsDataURL(_file); //这个是很重要的一步  讲读取到的文件编码成DataURL 否则不能用
				console.log("reader");
				console.log(reader);
				reader.onload = function() {
					img.setAttribute('src', this.result);
				};

			}
		</script>
	</body>

</html>
复制代码
 <!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>

	<body>
		<script type="text/javascript">
			var result = document.getElementById("result");
			var file = document.getElementById("file");

			//判断浏览器是否支持FileReader接口  
			if(typeof FileReader == 'undefined') {
				result.InnerHTML = "<p>你的浏览器不支持FileReader接口!</p>";
				//使选择控件不可操作  
				file.setAttribute("disabled", "disabled");
			}

			function readAsDataURL() {
				//检验是否为图像文件  
				var file = document.getElementById("file").files[0];
				if(!/image\/\w+/.test(file.type)) {
					alert("看清楚,这个需要图片!");
					return false;
				}
				var reader = new FileReader();
				//将文件以Data URL形式读入页面  
				reader.readAsDataURL(file);
				reader.onload = function(e) {
					var result = document.getElementById("result");
					//显示文件  
					result.innerHTML = '<img src="" alt="" />';
				}
			}

			function readAsBinaryString() {
				var file = document.getElementById("file").files[0];
				var reader = new FileReader();
				//将文件以二进制形式读入页面  
				reader.readAsBinaryString(file);
				reader.onload = function(f) {
					var result = document.getElementById("result");
					//显示文件  
					result.innerHTML = this.result;
				}
			}

			function readAsText() {
				var file = document.getElementById("file").files[0];
				var reader = new FileReader();
				//将文件以文本形式读入页面  
				reader.readAsText(file);
				reader.onload = function(f) {
					var result = document.getElementById("result");
					//显示文件  
					result.innerHTML = this.result;
				}
			}
		</script>
		<p>
			<label>请选择一个文件:</label>
			<input type="file" id="file" />
			<input type="button" value="读取图像" onclick="readAsDataURL()" />
			<input type="button" value="读取二进制数据" onclick="readAsBinaryString()" />
			<input type="button" value="读取文本文件" onclick="readAsText()" />
		</p>
		<div id="result" name="result"></div>
	</body>

</html>复制代码





上传文件预览:

准备上传

<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>文件上传</title>
		<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css">
		<script src=""></script>
		<style>
			body,
			html {
				margin: 0 auto;
			}
			
			.up-header {
				width: 600px;
				text-align: center;
			}
			
			.up-content {
				min-height: 200px;
				border: 1px solid #CCCCCC;
				display: flex;
				flex-direction: column;
				justify-content: center;
				align-items: center;
				background-color: #FAFAFA;
				color: #999;
				font-size: 20px;
				text-align: center;
			}
			
			.up-area {
				border: 2px dashed #ccc;
				margin: 10px 20px 20px 20px;
				width: 300px;
				min-height: 200px;
				line-height: 100px;
				background-color: #fff;
			}
			
			.list-group {
				margin: 0px auto;
				;
				width: 200px;
				min-height: 100px;
				padding: 10px;
			}
			
			img {
				max-width: 100%;
			}
			
			.btn {}
			
			.close {
				margin-left: 550px;
				margin-top: -20px;
			}
		</style>
	</head>

	<body>

		<header id="header" class="page-header">
			<!-- 头部显示 -->
			<div class="container upload ">
				<div class="up-header center-block">
					<h2>文件上传——两种形式</h2>
					<div class="input-group" style="width:600px; display:flex;">
						<input type="text" class="form-control" placeholder="在此处粘贴图片网址">
						<button type="button" class="btn btn-primary">上传图片</button>
					</div>
				</div>
				<div class="row">
					<!-- 拖拽图片到这来 -->
					<div class="col-md-5 col-md-offset-1 up-content  dragFile">
						<p style="margin-top:10px;">拖拽图片到这里哟</p>
						<div class="up-area">
							<input type="file" style="display:none;" id="fileDrag" name="fileDragselect" multiple>
							<div class="row">
								<ul class="list-group clearfix list-drag">
								</ul>
							</div>
						</div>

					</div>
					<!-- 点击按钮上传文件 -->
					<div class="col-md-5 up-content btnFile">
						<div class="btn">
							<button type="button" class="btn btn-success" id="btn"> 本地上传文件</button>
							<input type="file" style="display:none;" id="fileInput" name="fileselect" multiple>
						</div>
						<div class="up-area">
							<div class="row">
								<ul class="list-group clearfix list-btn">
								</ul>
							</div>
						</div>
					</div>
				</div>

			</div>
		</header>

		<script type="text/javascript">
			//点击本地上传文件
			$('#btn').click(() => {
				$('#fileInput').click();
			})
			$('#fileInput').change((event) => {
				var files = event.target.files;
				appendFile(files, '.list-btn');
			})
			//拖拽上传文件 在页面进行预览 上传form用到ajax
			const dragbox = document.querySelector('.dragFile');
			dragbox.addEventListener('dragover', function(e) {
				e.preventDefault(); // 必须阻止默认事件
			}, false);
			dragbox.addEventListener('drop', function(e) {
				e.preventDefault(); // 阻止默认事件
				var files = e.dataTransfer.files; //获取文件
				appendFile(files, '.list-drag')
				// code
			}, false);

			function appendFile(files, listName) {
				for(file of files) {
					let url = window.URL.createObjectURL(file);
					let liStr = `
		            <li class="list-group-item">
		              <div>
		                <img src="" alt="文件" />
		              </div>
		            </li>
		          `;
					$(listName).append(liStr);
				}
			}
		</script>

	</body>

</html>复制代码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值