zoukankan      html  css  js  c++  java
  • 图片上传预览

    由于JavaScript对用户上传的文件操作非常有限,尤其是无法读取文件内容,使得很多需要操作文件的网页不得不用Flash这样的第三方插件来实现。

    随着HTML5的普及,新增的File API允许JavaScript读取文件内容,获得更多的文件信息。

    HTML5的File API提供了FileFileReader两个主要对象,可以获得文件信息并读取文件。

    下面的例子演示了如何读取用户选取的图片文件,并在一个<div>中预览图像:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width"/>
    <title>文件api</title>
    <style>
    #test-image-preview {
    500px;
    height:500px;
    border:1px solid #ff0000;
    }
    </style>
    <script>
        	window.onload=function(){
    var fileInput = document.getElementById('test-image-file');
    var info = document.getElementById('test-file-info');
    var preview = document.getElementById('test-image-preview');
    fileInput.addEventListener('change',function(){
        console.log('change...');
        preview.style.backgroundImage='';
        if (!fileInput.value){
            info.innerHTML = '没有选择文件';
            return ;
        }
        var file = fileInput.files[0];
        info.innerHTML = '文件:' + file.name + '<br>'+'大小:'+file.size+'<br>'+'修改:'+file.lastModifiedDate;
        if(file.type !== 'image/jpeg' && file.type !== 'image/png' && file.type !== 'image/gif'){
            alert('不是有效的图片文件!');
            return;
        }
        var reader = new FileReader();
        reader.onload=function(e){
            console.log('reader.onload');
            var data = e.target.result;
            preview.style.backgroundImage='url('+ data +')';
        };
        reader.readAsDataURL(file);
    });
    };
        </script>
    </head>
    <body>
    <div id="test-file-info">
    </div>
    <div id="test-image-preview">
    </div>
    <form action="">
    	<input id="test-image-file" type="file">
    </form>
    </body>
    </html>
    

    上面的代码演示了如何通过HTML5的File API读取文件内容。以DataURL的形式读取到的文件是一个字符串,类似于data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...,常用于设置图像。如果需要服务器端处理,把字符串base64,后面的字符发送给服务器并用Base64解码就可以得到原始文件的二进制内容。
    回调
    上面的代码还演示了JavaScript的一个重要的特性就是单线程执行模式。在JavaScript中,浏览器的JavaScript执行引擎在执行JavaScript代码时,总是以单线程模式执行,也就是说,任何时候,JavaScript代码都不可能同时有多于1个线程在执行。
    你可能会问,单线程模式执行的JavaScript,如何处理多任务?
    在JavaScript中,执行多任务实际上都是异步调用,比如上面的代码:
    reader.readAsDataURL(file);
    就会发起一个异步操作来读取文件内容。因为是异步操作,所以我们在JavaScript代码中就不知道什么时候操作结束,因此需要先设置一个回调函数:

    reader.onload = function(e) {
        // 当文件读取完成后,自动调用此函数:
    };
    

    当文件读取完成后,JavaScript引擎将自动调用我们设置的回调函数。执行回调函数时,文件已经读取完毕,所以我们可以在回调函数内部安全地获得文件内容。

  • 相关阅读:
    扁鹊见蔡桓公
    月出
    TypeScript 基本类型
    随机漂浮图片广告实例代码
    js实现的随机颜色实例代码
    初识JavaScript 变量, 操作符, 数组
    HTML5的新结构标签
    14款超时尚的HTML5时钟动画
    CSS如何设置div半透明效果
    Google Doodle 2015圣诞版背后的故事与十年圣诞回顾
  • 原文地址:https://www.cnblogs.com/aten/p/9248675.html
Copyright © 2011-2022 走看看