jQuery 图片上传前预览


使用jQuery 实现图片的本地预览,兼容现代浏览器与IE浏览器,可同时实现多图片预览,删除预览图片等

IE浏览器:对于IE使用滤镜来显示预览(DXImageTransform.Microsoft.AlphaImageLoader)
现代浏览器:使用load-image.all.min.js来预览图片,load-image是等比例缩放图片浏览插件

fileinput.css下载:fileinput.css

          图片上传前预览

实现思路:定义一个table,td中定义一个input输入域,input的class为“input-image”表示为图片上传输出框,在页面加载完成,遍历“input-image”
调用initFilePreview方法初始化图片预览,第一个参数是input对象,sizes已存在图片的宽和高(sizes对于已存在的图片),width图片预览区域宽度,
height图片预览区域高度

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    
    <link href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet">
    <link href="http://cdn.bootcss.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet">
    <link href="fileinput.css" rel="stylesheet">
    <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <script type="text/javascript" src="http://cdn.bootcss.com/blueimp-load-image/2.10.0/load-image.all.min.js"></script>
</head>
<body>
<table>
   <tr>
     <td>
        <input name="tImage" type="hidden" class="input-image" style="width: 500px; height: 265px;"> 
      </td>
    </tr>    
</table>
</body>
    <script>
 $(function() {
     //遍历图片输出域
     $(".input-image").each(function(){
	     var height = $(this).height();
	     var width = $(this).width();
	     var sizes = new Array();
	     $(this).nextAll("img").each(function() {
	          var sizeObj = {w:$(this).width(), h:$(this).height(), img:$(this)};
	          sizes.push(sizeObj);
	     });
	     
         //初始化图片预览区域
	     $.initFilePreview($(this), sizes, width, height);
	});
 })
// form upload image
jQuery.extend({
     initFilePreview:function(inputImgObj, sizes, width, height) {
        var fieldName = inputImgObj.attr("name");
        var appendToObj = inputImgObj.parent("td");
        var html ="<div class='file-preview' style='height: "+height+"px;width: "+width+"px;'>"
            html+= "<div class='file-drop-zone'>";
            html+=     "<div class='file-preview-thumbnails file-preview-hbs' style='height:100%;width:"+(width - 20)+"px;'>";
            html+=     "</div>";
            html+= "</div>";
            html+= "<div class='fileinput-upload-button' style='width:100%;text-align:center;display:table;margin-top:3px;'>";
            html+=     "<button class='btn btn-success btn-squared fileinput-button' type='button' onclick=\"$.uploadImages(this, '"+fieldName+"')\">上传</button>";
            html+=     "<span class='btn btn-success btn-squared fileinput-button'>";
            html+=         "<span>选择图片</span>";
            html+=         "<input type='file' name='file_"+fieldName+"' onchange='$.selectedUploadImage(this, event)'>";
            html+=     "</span>";
            html+= "</div>";
            html+="</div>";
            appendToObj.append(html);
            $.initImagePreviewFrame(fieldName, sizes);
     },
     initImagePreviewFrame:function(inputName, sizes) {
        var inputObj = $("input[type=hidden][name="+inputName+"]");
        var imagePaths = inputObj.val();
        if(imagePaths != "") {
           var previewFrameDiv = inputObj.parent("td").find("div.file-preview-thumbnails");
           var frameHeight = previewFrameDiv.height();
           
		   var height = Math.max(50, frameHeight-65);
           if(!previewFrameDiv) {
              return;
           }
           var imageArray = imagePaths.split(",");
           var timeId = new Date().getTime(); 
           for(var i = 0; i < imageArray.length; i++) {
              var sizeObj = sizes[i];
              var sizeH = sizeObj.h;
              var sizeW = sizeObj.w;
              var width = (height/sizeH) * sizeW;
              previewFrameDiv.append($.createFilePreviewFrame(inputName, timeId + i, height, width));
              imageObj = sizeObj.img;
              var cloneImg = imageObj.clone()
              cloneImg.width(width);
              cloneImg.height(height);
              cloneImg.show();
              imageObj.remove();
              $("#imagePreview-" + (timeId + i)).append(cloneImg);
              $("#preview-" + (timeId + i)).attr("filePath", imageArray[i]);
           }
        }
     },

     createFilePreviewFrame:function(fieldName, id, height, width) {
	     var html = "<div class='file-preview-frame' id='preview-" + id + "'>";
		     html+= "<div id='imagePreview-"+ id +"' style='filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod = scale); width:"+width+"px; height: "+height+"px;'>";
			 html+= "</div>";
			 html+= "<div class='file-thumbnail-footer'>";
			 html+=    "<div class='file-actions'>";
			 html+=      "<div class='file-footer-buttons'>";
			 html+=        "<button type='button' class='kv-file-remove btn btn-xs btn-default' title='删除文件' onclick=\"$.deleteFilePreviewFrame("+id+", '"+fieldName+"')\">";
			 html+=          "<i class='fa fa-trash-o red icon-size-14'></i>";
			 html+=        "</button>";
			 html+=      "</div>";
			 html+=    "</div>";
			 html+=  "</div>";
			 html+= "</div>";
	     return html;
	 },
	 createFileinputButton:function(fieldName) {
         var html = "<span class='btn btn-success btn-squared fileinput-button'>";
		     html+=    "<span>选择图片</span>";
			 html+=    "<input type='file' name='file_"+fieldName+"' onchange='$.selectedUploadImage(this, event)'>";
			 html+= "</span>";
	     return html;
	 },
	 deleteFilePreviewFrame:function(id, fieldName) {
	     
	     var preview = $("#preview-" + id);
	     var filePath = preview.attr("filePath");

		  
		  var previewFrameDiv = preview.parent(".file-preview-thumbnails");
		  
		  //delete preview image
          preview.remove();
          //delete file upload button
          $("#file-" + id).parent("span").remove();
          
          $.deleteImage(previewFrameDiv, fieldName);
	 },
	 selectedUploadImage:function(obj, e) {
         var timeId = new Date().getTime();

		 var fileObj = $(obj);
         fileObj.attr("id", "file-" + timeId);
         
         var fileName = fileObj.attr("name");
         var fieldName = fileName.substring("file_".length, fileName.length);

		 var btnDiv = fileObj.closest(".fileinput-upload-button");
		 btnDiv.append($.createFileinputButton(fieldName));

		 var previewFrameDiv = fileObj.closest(".fileinput-upload-button").prev().find(".file-preview-thumbnails");
		 var frameHeight = previewFrameDiv.height() - 35;
		 var frameWidth = previewFrameDiv.width() - 20;
		 
		 var height = Math.max(50, frameHeight);
		 var width = Math.max(50, frameWidth)/2;
		 previewFrameDiv.append($.createFilePreviewFrame(fieldName, timeId, height, width));

		 $.displayPreviewImage(timeId, e, height, width);
         //hide current file button
		 fileObj.parent("span").hide();
	 },
	 displayPreviewImage:function(id, e, height, width) {
         if(!$.support.leadingWhitespace){
			   var obj = document.getElementById("file-" + id);
			   obj.select();
			   var path = document.selection.createRange().text;

			   var sizes = $.getIePreviewImageSize(id, path);
			   var hPercent = height/sizes[1];
			   var width = hPercent * sizes[0];

			   var picpreview=document.getElementById("imagePreview-" + id);
			   try{
			        picpreview.style.width = width;
					picpreview.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = path;
			   } catch (ex){
					alert("file path error!");
					return false;
			   }
		   } else {
			  var file = e.target.files[0];
			  loadImage(
				file,
				function(img) {
					$("#imagePreview-" + id).prepend(img);
				},
				{maxWidth: width, maxHeight:height}
			);
		  }
	 },
	 getIePreviewImageSize:function(id, path) {
	       var picpreview=document.getElementById("imagePreview-" + id);
	       var tempDiv=document.createElement("div");  
           picpreview.appendChild(tempDiv);  
		   tempDiv.style.width="10px";  
		   tempDiv.style.height="10px";  
		   tempDiv.style.diplay="none";  
		   tempDiv.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);";  
		   tempDiv.id="previewTemp";  
		   tempDiv.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src=path;  
		   var width=tempDiv.offsetWidth;  
		   var height=tempDiv.offsetHeight;  
		   picpreview.removeChild(tempDiv);

           var sizes = new Array();
		   sizes.push(width);
		   sizes.push(height);

		   return sizes;
	 },
	 uploadImages:function(obj, fileName) {
	      var flag = false;
	      $("input[type='file'][name='file_"+fileName+"']").each(function(){
	          var fileName = $(this).val();
			  if(fileName != "" && (fileName.endWith(".png") || fileName.endWith(".PNG") ||
			  fileName.endWith(".jpg") || fileName.endWith(".JPG") || fileName.endWith(".jpeg") || fileName.endWith(".JPEG")
			  || fileName.endWith(".bmp") || fileName.endWith(".BMP") || fileName.endWith(".gif") || fileName.endWith(".GIF"))) {
			     flag = true;
			  }
		  });
		  
		  if(!flag) {
		      layer.alert('请选择图片上传!', {icon: 0});
		      return false;
		  }
		  
	      var fileObj = $(obj).closest(".fileinput-upload-button").prev();
	      var previewFrameDiv = fileObj.find(".file-preview-thumbnails");
	      var hiddenInput = $("input[type=hidden][name="+fileName+"]");
	      
	      var loadIdx = layer.load();
	      
          $.ajaxFileUpload({
			  url:form.uploadUrl,
			  secureuri:false,
			  fileElementName:"file_" + fileName,
			  dataType: 'json',
			  success: function(data, status){
			     layer.close(loadIdx);
			     if(data.code == 411) {
			    	 layer.alert('图片最大不能超过' + data.error, {icon: 0});
			    	 return false;
			     }
			     
			     var imageData = data.value;
			     layer.msg('图片上传成功', {time: 1000, shadeClose:true});
			     var filePaths = "";
			     var index = 0;
			 	 previewFrameDiv.find(".file-preview-frame").each(function(){
			 	     if(!$(this).attr("filePath") && index < imageData.length) {
			 	        $(this).attr("filePath", imageData[index]);
			 	        index ++;
			 	     }
			 	     
			 	     filePaths += $(this).attr("filePath");
			 	     filePaths += ",";
			 	 });
			 	 
			 	 if(filePaths.length > 1) {
			 	    filePaths = filePaths.substring(0, filePaths.length - 1);
			 	 }
			 	 
			 	 hiddenInput.val(filePaths);
			  }, error: function (data, status, e) {
			     layer.close(loadIdx);
				 layer.alert('上传失败!', {icon: 0});
			  }
		  });
		  
		  return false;
	 },
	 deleteImage:function(previewFrameDiv, fileName) {
	       var hiddenInput = $("input[type=hidden][name="+fileName+"]");
	       var filePaths = "";
		   previewFrameDiv.find(".file-preview-frame").each(function(){
		 	     if($(this).attr("filePath")) {
		 	         filePaths += $(this).attr("filePath");
		 	         filePaths += ",";
		 	     }
		   });
		   
		   if(filePaths.length > 1) {
		 	    filePaths = filePaths.substring(0, filePaths.length - 1);
		   }
		   hiddenInput.val(filePaths);
	 }
});
    </script>
</html>