zoukankan      html  css  js  c++  java
  • HTML5 之文件操作(file)

    前言

    在 HTML 文档中 <input type="file"> 标签每出现一次,一个 FileUpload 对象就会被创建。

    该元素包含一个文本输入字段,用来输入文件名,还有一个按钮,用来打开文件选择对话框以便图形化选择文件。

    该元素的 value 属性保存了用户指定的文件的名称,但是当包含一个 file-upload 元素的表单被提交的时候,浏览器会向服务器发送选中的文件的内容而不仅仅是发送文件名。

    当用户选择或编辑一个文件名,file-upload 元素触发 onchange 事件句柄。

    看个简单例子:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <!-- oscar999  -->  
    2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    3. <html>  
    4.   <head>  
    5.   <meta http-equiv="content-type" content="text/html; charset=utf-8">  
    6.   <meta name="author" content="oscar999">  
    7.   <title></title>  
    8.   <script>  
    9.   function  handleFiles(files)  
    10.   {  
    11.     if(files.length)  
    12.     {  
    13.        var file = files[0];  
    14.        var reader = new FileReader();  
    15.        reader.onload = function()  
    16.        {  
    17.            document.getElementById("filecontent").innerHTML = this.result;  
    18.        };  
    19.        reader.readAsText(file);  
    20.     }  
    21.   }  
    22.   </script>  
    23.     
    24.   </head>  
    25.   <body>  
    26.   
    27.   <input type="file" id="file" onchange="handleFiles(this.files)"/>  
    28.   <div id="filecontent"></div>  
    29.   </body>  
    30. </html>  

    这里读取一个文件, 显示在div 中。

    (在IE8 中 无效, this.files 无法读取文件。这个属于html5 的特性)

    当选择了一个文件时,就会把包含这个文件的列表(一个FileList对象)作为参数传给handleFiles()函数了。
    这个FileList对象类似一个数组,可以知道文件的数目,而它的元素就是File对象了。
    从这个File对象可以获取name、size、lastModifiedDate和type等属性。
    把这个File对象传给FileReader对象的读取方法,就能读取文件了。

    HTML5 Drag and Drop File

    HTML5 支持的File 的操作不仅仅是文件的选择,

    在HTML5 之前需要使用 Applet 和 SilverLight 才能达到的文件拖拽功能,在HTML5 中也能轻松的实现,

    看代码:

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    2. <html>  
    3.   <head>  
    4.   <meta http-equiv="content-type" content="text/html; charset=utf-8">  
    5.   <meta name="author" content="oscar999">  
    6.   <title></title>  
    7.   </head>  
    8.   <body>  
    9.     <div id="dropbox"> Drop Here </div>  
    10.     <div id="filecontent"></div>  
    11.     <script>  
    12.       var dropbox = document.getElementById("dropbox");    
    13.       dropbox.addEventListener("dragenter", dragenter, false);    
    14.       dropbox.addEventListener("dragover", dragover, false);    
    15.       dropbox.addEventListener("drop", drop, false);     
    16.   
    17.     function dragenter(e) {    
    18.         e.stopPropagation();    
    19.         e.preventDefault();    
    20.     }    
    21.   
    22.     function dragover(e) {    
    23.         e.stopPropagation();    
    24.         e.preventDefault();    
    25.     }  
    26.   
    27.     function drop(e) {    
    28.         e.stopPropagation();    
    29.         e.preventDefault();     
    30.         var dt = e.dataTransfer;    
    31.         var files = dt.files;  
    32.         if(files.length)  
    33.         {  
    34.            var file = files[0];  
    35.            var reader = new FileReader();  
    36.            reader.onload = function()  
    37.            {  
    38.                document.getElementById("filecontent").innerHTML = this.result;  
    39.            };  
    40.            reader.readAsText(file);  
    41.         }  
    42.     }   
    43.             
    44.     </script>  
    45.   </body>  
    46. </html>  

    这里通过事件对象的 dataTransfer 可以得到文件。

    读取文件内容

    在第一个例子中, 我们使用 FileReader类来读取文件的内容,

    在 W3C 草案中,File 对象只包含文件名,文件类型等只读属性;FileReader用于内容读取和监控读取状态。

    (在firefox 中, 可以直接使用 var fileBinary = file.getAsBinary();  读取文件的二进制源码)

    FileReader提供的方法包括:

    1. readAsBinaryString

    2. readAsDataURL

    3. readAsText

    4. abort

    .........

    以下,举一个 使用 FileReader 将用户选择的图片不通过后台即时显示出来的例子。

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. function handleFiles(files){  
    2.     for (var i = 0; i files.length; i++) {  
    3.         var file = files[i];  
    4.         var imageType = /image.*/;  
    5.           
    6.         if (!file.type.match(imageType)) {  
    7.             continue;  
    8.         }  
    9.           
    10.         var img = document.createElement("img");  
    11.         img.classList.add("obj");  
    12.         img.file = file;  
    13.         preview.appendChild(img);  
    14.           
    15.         var reader = new FileReader();  
    16.         reader.onload = (function(aImg){  
    17.             return function(e){  
    18.                 aImg.src = e.target.result;  
    19.             };  
    20.         })(img);  
    21.         reader.readAsDataURL(file);  
    22.     }  
    23. }  



    同后端的交互

    在一般的HTML  中,使用方式是把file input 放在form 中, 以POST 方式把文件传递到后端。

    在 HTML5 中, 也可以通过 FileReader 的 readAsBinaryString 方法读取到文件的二进制码,然后通过 XMLHttpRequest 的 sendAsBinary 方法将其发送出去。

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. var xhr = new XMLHttpRequest();  
    2. xhr.open("POST", "url");  
    3. xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');  
    4. <pre code_snippet_id="422893" snippet_file_name="blog_20140709_4_2106578" class="sh_javascript sh_sourceCode" name="code">xhr<span class="sh_symbol">.</span><span class="sh_function">sendAsBinary</span><span class="sh_symbol">(</span>binaryString<span class="sh_symbol">);</span></pre><br>  



    参考

    浏览器支持

    适用于 Firefox 3.6+ ,Chrome ,部分适用于其他支持 HTML 5 接口的浏览器,完全不适用于 IE8 及以下版本

    转自 http://blog.csdn.net/oscar999/article/details/37499743

  • 相关阅读:
    今天没有去上班
    [转]分析ASP.NET读取XML文件4种方法
    Div+CSS布局入门教程
    net 怎么调用迅雷
    类图(Class Diagram)
    asp.net删除文件夹后引起Session丢失的解决办法[转]
    对象图(Object Diagram)
    C#使用Strings.StrConv进行简繁体转换
    ASP.NET使用Memcached高缓存实例(入门级)[转]
    类似豆丁网、百度文库的开源文档播放器源码下载[转]
  • 原文地址:https://www.cnblogs.com/zhishaofei/p/4208943.html
Copyright © 2011-2022 走看看