PHP群:95885625 Hbuilder+MUI群:81989597 站长QQ:634381967
    您现在的位置: 首页 > 开发编程 > HTML5+CSS3教程 > 正文

    input[type=file]:如何本地预览图片

    作者:admin来源:网络浏览:时间:2020-09-30 00:07:50我要评论
    导读:在浏览器中怎样能看到自己刚通过input[type=file]选中的图片文件呢,一般的做法,是将图片文件异步上传到服务器,获取它在服务器的url,再...
    在浏览器中怎样能看到自己刚通过input[type=file]选中的图片文件呢,一般的做法,是将图片文件异步上传到服务器,获取它在服务器的url,再将这个url赋值给一个img元素的src属性来实现的,这种做法往往会在服务器端产生大量的临时资源,而且还浪费了流量。那么如何不借助服务器,在本地实现图片的预览功能呢?对于现代浏览器,我们可以使用HTML5的File API,而对于不支持它们的IE9及其以下版本我们可以借助IE的滤镜来实现。

    如何本地预览图片

    HTML5 File API

    实现说起来也很简单,通过FileReader对象的readAsDataURL()方法,将图片文件转化为base64字符串,再将其赋值给img的src属性,即可实现图片文件的预览,另外我们可以通过监听img元素的onload事件,来获得图片文件的实际大小。浏览器的支持情况可以参考这里

    1. //www.bcty365.com 
    2. <!DOCTYPE html> 
    3. <html lang="en"
    4. <head> 
    5.     <meta charset="UTF-8"
    6.     <title>Document</title> 
    7.     <style> 
    8.         .preview-container { 
    9.             position: relative; 
    10.             width: 200px; 
    11.             height: 200px; 
    12.             background-color: #eee; 
    13.         } 
    14.         .preview-container img { 
    15.             display: none; 
    16.             position: absolute; 
    17.         } 
    18.     </style> 
    19. </head> 
    20. <body> 
    21.     <input type="file"
    22.     <div class="preview-container"
    23.         <img> 
    24.     </div> 
    25.     <script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script> 
    26.     <script> 
    27.         var previewrWidth = 200; 
    28.         var previewrHeight = 200; 
    29.  
    30.         var $img = $('img'); 
    31.         $('input[type=file]').change(function() { 
    32.             var reader = new FileReader(); 
    33.             reader.onload = function(e) { 
    34.                 $img.prop('src', e.target.result); 
    35.             } 
    36.             reader.readAsDataURL(this.files[0]); 
    37.  
    38.             $('img').load(function() { 
    39.                 var size = autoSize(this.naturalWidth, this.naturalHeight); 
    40.                 $(this).css({ 
    41.                     width: size.width, 
    42.                     height: size.height, 
    43.                     top: (previewrHeight - size.height) / 2, 
    44.                     left: (previewrWidth - size.width) / 2 
    45.                 }).show(); 
    46.             }); 
    47.         }); 
    48.  
    49.         function autoSize(width, height) { 
    50.             var scale = width / height; 
    51.             if (scale >= previewrWidth / previewrHeight) { 
    52.                 height = previewrWidth / scale; 
    53.                 width = previewrWidth; 
    54.             } else { 
    55.                 width = previewrHeight * scale; 
    56.                 height = previewrHeight; 
    57.             } 
    58.             return { 
    59.                 width: width, 
    60.                 height: height 
    61.             } 
    62.         } 
    63.     </script> 
    64. </body> 
    65. </html> 

     

    IE Filter

    对于IE9及其以下版本我们可以通过IE的滤镜来实现同样的功能,首先通过选中input[type=file]的文本区域来获取选中文件的本地路径,再将其赋值给div元素的filter,即可实现本地预览,但是为了获得图片文件的实际宽高,我们还需要一个额外的img元素,通过设置它的filter来获取。

    1. //www.bcty365.com 
    2. <!DOCTYPE html> 
    3. <html lang="en"
    4. <head> 
    5.     <meta charset="UTF-8"
    6.     <title>Document</title> 
    7.     <style> 
    8.         .preview-container { 
    9.             position: relative; 
    10.             width: 200px; 
    11.             height: 200px; 
    12.             background-color: #eee; 
    13.         } 
    14.         .preview-container .preview { 
    15.             display: none; 
    16.             position: absolute; 
    17.         } 
    18.         .preview-container .fake { 
    19.             filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image); 
    20.         } 
    21.     </style> 
    22. </head> 
    23. <body> 
    24.     <input type="file"
    25.     <div class="preview-container"
    26.         <div class="preview"></div> 
    27.         <img class="fake"
    28.     </div> 
    29.     <script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script> 
    30.     <script> 
    31.         var previewrWidth = 200; 
    32.         var previewrHeight = 200; 
    33.  
    34.         var $img = $('.preview'); 
    35.         var $fakeImg = $('.fake'); 
    36.         $('input[type=file]').change(function() { 
    37.             this.select(); 
    38.             this.blur(); 
    39.             var src = document.selection.createRange().text; 
    40.  
    41.             $fakeImg.show(); 
    42.             var fakeImg = $fakeImg[0]; 
    43.             fakeImg.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src; 
    44.             var size = autoSize(fakeImg.offsetWidth, fakeImg.offsetHeight); 
    45.             $fakeImg.hide(); 
    46.  
    47.             $img.css({ 
    48.                 width: size.width, 
    49.                 height: size.height, 
    50.                 top: (previewrHeight - size.height) / 2, 
    51.                 left: (previewrWidth - size.width) / 2, 
    52.                 filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="' + src + '"' 
    53.             }).show(); 
    54.         }); 
    55.  
    56.         function autoSize(width, height) { 
    57.             var scale = width / height; 
    58.             if (scale >= previewrWidth / previewrHeight) { 
    59.                 height = previewrWidth / scale; 
    60.                 width = previewrWidth; 
    61.             } else { 
    62.                 width = previewrHeight * scale; 
    63.                 height = previewrHeight; 
    64.             } 
    65.             return { 
    66.                 width: width, 
    67.                 height: height 
    68.             } 
    69.         } 
    70.     </script> 
    71. </body> 
    72. </html> 

     

    转载请注明(B5教程网)原文链接:https://b5.mxunkeji.com/content-142-3169-1.html
    相关热词搜索: