前言

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

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

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

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

看个简单例子:

  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. </head>
  24. <body>
  25. <input type="file" id="file" onchange="handleFiles(this.files)"/>
  26. <div id="filecontent"></div>
  27. </body>
  28. </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 中也能轻松的实现,

看代码:

  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. function dragenter(e) {
  17. e.stopPropagation();
  18. e.preventDefault();
  19. }
  20. function dragover(e) {
  21. e.stopPropagation();
  22. e.preventDefault();
  23. }
  24. function drop(e) {
  25. e.stopPropagation();
  26. e.preventDefault();
  27. var dt = e.dataTransfer;
  28. var files = dt.files;
  29. if(files.length)
  30. {
  31. var file = files[0];
  32. var reader = new FileReader();
  33. reader.onload = function()
  34. {
  35. document.getElementById("filecontent").innerHTML = this.result;
  36. };
  37. reader.readAsText(file);
  38. }
  39. }
  40. </script>
  41. </body>
  42. </html>

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

读取文件内容

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

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

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

FileReader提供的方法包括:

1. readAsBinaryString

2. readAsDataURL

3. readAsText

4. abort

.........

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

  1. function handleFiles(files){
  2. for (var i = 0; i < files.length; i++) {
  3. var file = files[i];
  4. var imageType = /image.*/;
  5. if (!file.type.match(imageType)) {
  6. continue;
  7. }
  8. var img = document.createElement("img");
  9. img.classList.add("obj");
  10. img.file = file;
  11. preview.appendChild(img);
  12. var reader = new FileReader();
  13. reader.onload = (function(aImg){
  14. return function(e){
  15. aImg.src = e.target.result;
  16. };
  17. })(img);
  18. reader.readAsDataURL(file);
  19. }
  20. }

同后端的交互

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

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

  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

HTML5 之文件操作(file)的更多相关文章

  1. [JS进阶] HTML5 之文件操作(file)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/oscar999/article/details/37499743 前言 在 HTML 文档中 < ...

  2. HTML5 本地文件操作之FileSystemAPI实例(二)

    文件操作实例整理二 1.删除文件.复制文件.移动文件 //获取请求权限 window.requestFileSystem = window.requestFileSystem || window.we ...

  3. HTML5 本地文件操作之FileSystemAPI实例(一)

    文件操作实例整理一 1.请求系统配额类型 console.info(window.TEMPORARY); //0 临时 console.info(window.PERSISTENT); //1 持久 ...

  4. HTML5 本地文件操作之FileSystemAPI整理(二)

    一.文件目录操作 1.DirectoryEntry对象 属性: 1.isFile: 操作对象的是否为文件,DirectoryEntry对象固定其值为false 2.isDirectory: 操作对象是 ...

  5. HTML5 本地文件操作之FileSystemAPI整理(一)

    一.请求配额 DeprecatedStorageInfo对象 window.webkitStorageInfo:当使用持久存储模式时需要用到该对象的接口 方法: 1.requestQuota(type ...

  6. HTML5 本地文件操作之FileSystemAPI简介

    一.FileSystemAPI简介 HTML5的文件操作Api中 1.FileAPI,用于基础的客户端本地文件读取,目前大多数接口已经被主流浏览器支持,点击查看更多参考 2.FileSystemAPI ...

  7. JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile

    Unit06: 文件操作--File . 文件操作-- RandomAccessFile java.io.FileFile的每一个实例是用来表示文件系统中的一个文件或目录 package day06; ...

  8. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  9. HTML5 本地文件操作之FileSystemAPI实例(四)

    目录操作Demo二 1.删除目录 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSyst ...

随机推荐

  1. java_JDBC(2)

    1.Statement 每次执行sql语句,数据库都要执行sql语句的编译 ,最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement. 2.PreparedStatemen ...

  2. 原生JS获取HTML样式并修改

    大家都知道在JavaScript原生操作中获取元素的样式,在实际操作是使用时比较频繁的一件事,这里像大家介绍下获取css样式的方法,希望可以帮助一些需要的人,如果有幸被大牛看到,有更好的办法,欢迎提出 ...

  3. mysql优化---订单查询优化:异步分页处理

    订单分页查询: 老的代码是顺序执行查询数据和计算总记录数,但是如果条件复杂的话(比如关联子表)查询的时间要超过20s种 public static PagedList<Map<String ...

  4. android学习8——获取view在屏幕上的绝对坐标

    获取view在屏幕上的绝对坐标在调试时候非常有用. 看如下代码 public class AbsolutePosActivity extends Activity { @Override public ...

  5. WIn7下Ubuntu 14.04 安装

    1. 在Windows下下载Ubuntu14.04的ISO镜像,解压 2. 打开wubi.exe,填写用户名,密码等相关信息,在这里需要注意的是,磁盘空间最好选到最大(30G),执行安装 3. 按照提 ...

  6. Jemter性能测试

    Jmeter 介绍 Jmeter  是一款使用Java开发的,开源免费的,测试工具, 主要用来做功能测试和性能测试(压力测试/负载测试). 而且用Jmeter 来测试 Restful API, 非常好 ...

  7. loadrunner11.0之IP欺骗

    一:设置虚拟ip地址 操作步骤: 1:添加ip地址 运行loadrunner---tools---IP wizard 2:选择create  new setting,点击"下一步" ...

  8. Ionic2中集成第三方控件Sweetalert

    Ionic2混合开发,入坑系列:Ionic2中集成第三方控件Sweetalert 注:Sweetalert2已经可以直接从npm中下载安装 npm install --save sweetalert2 ...

  9. VS2010 MSDN的介绍

    5     cout << temp; 博客园第一篇文章的开始. VS2010 MSDN的文档介绍 https://msdn.microsoft.com/zh-cn/library/dd8 ...

  10. 细谈position属性:static、fixed、relative与absolute

    学习WEB有些时日了,对DOM中的定位概念有些模糊,特地花了一个下午的时间搜资料.整理写下这篇随笔. 首先,我们要清楚一个概念:文档流. 简单的讲,就是窗体自上而下分成一行一行,并在每行中按照从左到右 ...