`

玩转HTML5应用实战:灵活拖拉文件

阅读更多
本人原创作品,原文发表在:
http://tech.it168.com/a2011/1207/1285/000001285230_all.shtml
转载请注明出处

在HTML5中,出现了众多的新的技术和特性,而本文将介绍的是目前HTML5标准中,对如何将用户客户端的文件拖拉到浏览器这一特性进行初步的讲解。在HTML5中的标准中,提到了希望能在新一代浏览器中,支持用户直接将客户端桌面的文件拖放到浏览器中,甚至鼓励做更多的工作(比如上传文件)。这篇文章将分如下几个方面进行初步的分析和探讨:

  如何将文件拖放到web页面中
  在Javascript中分析拖拽文件
  在客户端装载和解析文件
  使用 XMLHttpRequest2异步上传文件到服务端
  上传时显示一个进度条
  改进上传文件的表单,甚至支持IE 6,以让在各浏览器中可以兼容运行。
  并介绍如何单单只用Javascript实现,不用任何框架。
  目前浏览器对文件拖拉的支持

  在我们开始讲解前,我们先要说明下,由于HTML5的标准最终版本还没完全发布,各浏览器也不是完全都对所有功能进行支持,所以本文的程序有可能在今后的各浏览器中不能完全运行成功,但至少在本文发表时,会对以下浏览器在如下各方面进行支持。

  1) 目前程序能在所有的Firefox和Chrome的浏览器中很好的运行。

  2) Opera浏览器能解通过Javascript去解析文件,但不支持文件的拖拉到浏览器中及使用XMLHttpRequest2去上传文件。

  3) IE和Safari不支持任何本文提到的API和新特性。

  4) Apple不允许在iOS系统中使用HTML表单上传文件。

  下面,就让我们开始学习之旅吧。

  HTML和CSS

  我们先来看下上传文件的表单,代码如下:

<form id="upload" action="upload.php" method="POST" enctype="multipart/form-data">
<fieldset>
<legend>HTML File Upload</legend>
<input type="hidden" id="MAX_FILE_SIZE" name="MAX_FILE_SIZE" value="300000" />
<div>
    <label for="fileselect">Files to upload:</label>
    <input type="file" id="fileselect" name="fileselect[]" multiple="multiple" />
    <div id="filedrag">or drop files here</div>
</div>
<div id="submitbutton">
    <button type="submit">Upload Files</button>
</div>
</fieldset>
</form>
<div id="messages">
Status Messages

</div>



   可以看到,在这个表单中,放置了一个文件选择框,唯一跟HTML4不同的时,这个框采

  用的是HTML5中的一个新增的文件上传框属性multiple,允许选择多个不同的文件。此外,

  在id为 filedrag的div中,这个区域是用来将文件拖拉放置的区域,下文中会用到。

  接下来会看下CSS,代码如下:
#filedrag

  {

  display: none;

  font-weight: bold;

  text-align: center;

  padding: 1em 0;

  margin: 1em 0;

  color: #555;

  border: 2px dashed #555;

  border-radius: 7px;

  cursor: default;

  }

  #filedrag.hover

  {

  color: #f00;

  border-color: #f00;

  border-style: solid;

  box-shadow: inset 0 3px 4px #888;

  }




  在这段CSS中,设置了当文件拖放到页面的指定区域时的样式,这个样式是当文件被拖动

  到指定区域时,才起到作用的,是通过Javascript击发其起作用的,下文会提到。

  HTML5中的文件API

  在HTML5中,对文件的API有如下几点的新的改进,其标准可以参考

  (http://www.w3.org/TR/file-upload/)。

  FileList: 表示已选择的文件,以数组的形式表示。
  File: 代表一个单独的文件
  FileReader: FileReader是一个接口,它允许我们在客户端读取文件的数据,并且可以在Javascript中去使用。
  开始动手写Javascript

  下面,我们开始动手编写Javascript,首先我们编写一些工具javascript,比如:

// getElementById

  function $id(id) {

  return document.getElementById(id);

  }

  //

  // 输出信息

  function Output(msg) {

  var m = $id("messages");

  m.innerHTML = msg + m.innerHTML;

  }



  接者,我们编写init方法,去判断文件API的可用性,代码如下:

// 判断当前浏览器中文件API是否可用

  if (window.File && window.FileList && window.FileReader) {

  Init();

  }

  //

  // 初始化程序

  function Init() {

  var fileselect = $id("fileselect"),

  filedrag = $id("filedrag"),

  submitbutton = $id("submitbutton");

  // 添加文件选择的事件监听

  fileselect.addEventListener("change", FileSelectHandler, false);

  // 判断xmlhttprequest 2是否可用

  var xhr = new XMLHttpRequest();

  if (xhr.upload) {

  // file drop

  filedrag.addEventListener("dragover", FileDragHover, false);

  filedrag.addEventListener("dragleave", FileDragHover, false);

  filedrag.addEventListener("drop", FileSelectHandler, false);

  filedrag.style.display = "block";

  // remove submit button

  submitbutton.style.display = "none";

  }

  }




程序中,首先判断当前浏览器中文件API是否可用,如果可用的话则调用init的初始方法。在init方法中,做了如下几件事情:

  为文件的选择框增加了上传的监听事件。

  显示#filedrag区域

  设置了拖动文件经过放置区域时和文件离开放置区域时的事件以及样式。
  设置了当用户将文件拖动到放置区域最后松开鼠标,以决定文件放置时的事件。
  这里还隐藏了提交按钮,因为这里并不需要它了。
  当然,这里还可以连传统的文件上传浏览框也去掉,但这并不是十分友好,所以这里采用的是两者并存的方式。

  而用到了XMLHttpRequest的upload方法,主要是防止在一些浏览器中如果当文件上传API不可用时,则用旧的方法,不显示文件拖拉框,取而代之的是显示传统的上传提交按钮。

  考虑到很少用户很熟悉文件的这种拖拉上传用法,因此,我们在事件中对文件放置区域的样式进行设置,当文件被拖拉到区域中时,区域的边框会变成红色,以提醒用户,代码如下:
function FileDragHover(e) {

  e.stopPropagation();

  e.preventDefault();

  e.target.className = (e.type == "dragover" ? "hover" : "");

  }


 
这里判断是否文件拖拉到区域上方,如果是的话,则采用样式中的hover样式(见上文)。

  接下来,我们会在另外的一个div区域中,显示文件上传的小结信息,代码如下:
 function FileSelectHandler(e) {

  FileDragHover(e);

  // 获得所有的文件列表

  var files = e.target.files || e.dataTransfer.files;

  // 循环处理每个文件

  for (var i = 0, f; f = files[i]; i++) {

  ParseFile(f);

  }

  }




  在FileSelectHandler事件中,实现了如下的功能:

  1 调用FileDragHover()方法移除了hover的样式,并且取消浏览器的响应事件,否则的话浏览器会尝试显示文件的内容。

  2 将上传的文件放置到FileList对象数组中去,包括用传统文件上传框上传的及用拖拉方法上传的。

  3 单独使用一个方法ParseFile输出上传每个文件的具体属性信息,代码如下;

function ParseFile(file) {

  Output(

  "

  File information: " + file.name +

  " type: " + file.type +

  " size: " + file.size +

  " bytes

  "

  );

  }




  使用Javascript打开客户端文件

  现在,我们已经把客户端机器上的文件成功拖拉到浏览器中了,也就是说,我们用新的拖拉的方法,完成了以往要使用传统的文件上传选择框才能完成的工作!接下来,我们尝试通过Javascript,去判断用户上传的文件类型,并学习如何使用Javascript去操作客户端的文件。

  首先,为什么要通过Javascript去分析操作客户端的文件呢?假如要求用户上传很多文件,或者上传指定格式的图片,假如用户选好上传文件到服务端后,服务端才判断发现文件不符合要求,再要求用户重新上传的话,给用户的体验则不大友好,所以,希望能在用户在客户端选择完文件后就马上能判断出文件的大小和类型,如果是图片的话,甚至可以实现客户端图片预览的效果。

  在HTML5的起草标准中,提供了FileReader接口去处理客户端的文件,有如下几个重要API:

  readAsText(File f, [encoding]):将一个文件读入到字符串中去,其中可以选用文件的编码,默认的是UTF-8

  .readAsDataURL(File f): 将文件以data URL编码的方式读入文件内容,dat Url方式是一种以BASE64编码在页面中展示文件的方法,详细见:http://en.wikipedia.org/wiki/Data_URI_scheme

  .readAsBinaryString(File f): 将文件以二进制方式读取。.readAsArrayBuffer(File f):.将文件作为ArrayBuffer对象的方式读取。ArrayBuffer详见http://www.khronos.org/registry/typedarray/specs/latest/

  接下来,我们看下如何在Javascript中异步打开读取文件。

  Javascript中异步打开文件

  先来复习下之前我们用到的parseFile方法,代码如下:
function ParseFile(file) {

  Output(

  "

  File information: " + file.name +

  " type: " + file.type +

  " size: " + file.size +

  " bytes

  "

  );

  }



  这里只是简单显示了文件的文件名和文件大小,而接下来我们要判断是这个文件是否属于文件类型的文件(即text/plain,text/html,text/css等),可以使用FileReader.readAsText()方法读取并且去掉其中的<,>符号,代码如下;
if (file.type.indexOf("text") == 0) {

  var reader = new FileReader();

  reader.onload = function(e) {

  Output(

  "

  " + file.name + ":

  " +

  e.target.result.replace(//g, ">") +

  "

  "

  );

  }

  reader.readAsText(file);

  }




同样,我们希望将一张图片从用户的资源管理器中,拖拉到页面的放置区域后,能马上显示这张图片的实际内容以及大小,可以用如下代码实现:
// display an image 
if (file.type.indexOf("image") == 0) { 
 var reader = new FileReader(); 
 reader.onload = function(e) { 
Output( 
"[b]" + file.name + ":[/b]
" + 
'[img]' + e.target.result + '[/img]
' 
 ); 
 } 
 reader.readAsDataURL(file); 



这里,直接将图片的内容以FileReader的readAsDataURL方法读取入并显示。

  最后,我们可以通过http://blogs.sitepointstatic.com/examples/tech/filedrag/2/index.html观看我们的

  DEMO演示,请读者尝试从自己电脑上的windows资源管理器中,拖放图片或其他类型文

  件到页面的指定区域中,则会发现浏览器能自动识别用户拖放的文件,当然,请使用Chrome

  或Firefox浏览器才能看到效果。

  小结

  在本文中,为读者介绍了HTML5中新的文件处理API,利用文件处理API,可以实现让浏览器识别从用户端拖放到页面的文件,在下一讲中,将重点介绍如何上传这些已经拖放了的文件。

3
0
分享到:
评论

相关推荐

    图像分类数据集:卡车、拖拉机图像识别数据集(包括划分好的数据【文件夹保存】、类别字典文件)

    图像分类数据集:卡车、拖拉机图像识别数据集(包括划分好的数据【文件夹保存】、类别字典文件) 【分类个数:2】卡车、拖拉机【具体查看json文件】 【数据集详情】data目录下分为2个目录,训练集、测试集。存放...

    TUOLA.Rar_拖拉文件

    标题“TUOLA.Rar_拖拉文件”暗示了我们即将探讨的是有关计算机操作系统中的文件拖放操作,这一功能使得用户可以方便地通过鼠标将文件或文件夹从一个位置移动或复制到另一个位置。在Windows操作系统中,拖放操作是...

    拖拉机单机游戏下载使用

    5. 单机游戏的优势: 单机版拖拉机游戏的一大优点是无需网络连接,无论身处何处,只要有电脑,就能随时游玩。此外,它通常不会受到网络延迟、掉线等问题的影响,为玩家提供了更稳定的游戏体验。 6. 提高游戏体验:...

    拖拉机模型

    从给定文件信息中提取的知识点主要围绕“拖拉机模型”这个概念,以及对拖拉机及其配套的单轴悬挂式工具系统的建模、识别和分析。以下是一些详细的知识点: 1. 拖拉机模型的构建:研究通常需要对拖拉机系统进行详尽...

    文件的拖拉操作(5KB)...

    在这个"文件的拖拉操作"项目中,我们看到的源代码和资源主要关注于实现这一功能。以下是关于这个主题的详细解释: 1. **FORM界面**:在VB中,FORM是用户界面的基础,它代表了一个窗口或对话框,用户可以通过FORM与...

    拖拉机水冷系统 论文.doc

    根据给定文件的部分内容,我们可以总结出以下关于拖拉机技术发展历程及水冷系统的关键知识点: ### 拖拉机技术发展历程 #### 第一代拖拉机:电动与内燃机驱动 - **早期手动拖拉机**:最早的拖拉机为手动操作。 - *...

    Tableau数据可视化实战.pdf

    在本书中,我们将深入探讨 Tableau 数据可视化的实战应用。Tableau 作为一款非常强大的数据可视化工具,已经被全球数万家企业所采用。通过本书的学习,读者将能够快速掌握 Tableau 的使用,实现数据的可视化分析。 ...

    拖拉机game 拖拉机game

    很抱歉,但根据您提供的信息,"拖拉机game"似乎指的是某种基于"拖拉机"主题的游戏,而"拖拉机.exe"可能是这个游戏的可执行文件。然而,这并没有提供足够的具体IT知识点来撰写一篇超过1000字的文章。在没有更详细的...

    拖拉机源程序

    C++是一种强大的、面向对象的编程语言,它提供了丰富的库支持和高效的执行性能,非常适合创建复杂的桌面应用程序,如游戏。在这个特定的案例中,"拖拉机"可能是指一款基于中国流行的扑克游戏——拖拉机规则的游戏。 ...

    文件的拖拉操作

    在计算机操作系统中,文件的拖拉操作是一种直观且常见的用户界面交互方式,它极大地提高了用户在文件管理系统中的工作效率。这个功能允许用户通过鼠标或触控设备将一个或多个文件从一个位置移动到另一个位置,或者...

    HTML5 SVG实现可交互拖拉的赛车动画效果源码.zip

    在这个“HTML5 SVG实现可交互拖拉的赛车动画效果源码”项目中,我们将会探讨如何利用HTML5和SVG技术来创建一个动态且用户可交互的赛车游戏场景。 首先,SVG的优势在于它的图形是基于数学公式,而不是像素,这意味着...

    一套完整的拖拉拽的demo,可对其进行改造

    拖拉拽技术在现代软件和Web应用中广泛应用,它提供了用户友好的交互方式,使得用户可以通过简单的鼠标操作来移动、排列或操作界面元素。在这个"一套完整的拖拉拽的demo"中,我们可以深入探讨拖放功能的核心原理以及...

    HTML5 canvas实现的鼠标拖拉和点击生成甜甜圈饼干动画效果源码.zip

    在这个项目中,"HTML5 canvas实现的鼠标拖拉和点击生成甜甜圈饼干动画效果源码.zip",我们看到的是一个利用canvas技术和JavaScript来创建交互式动画的实例,特别关注了鼠标事件的处理以及动态图形的生成。...

    179.履带式拖拉机.rar

    5. **适用场景**:介绍履带式拖拉机在不同土壤条件、作物类型和地形环境下的应用,如耕作、播种、收割、运输等农田作业。 6. **设计改进**:可能还包括对现有履带式拖拉机的改进建议,比如提高燃油效率、增强耐用性...

    Scratch 3D 渲染模拟器:拖拉机模拟器.sb3

    向左箭头(或 A)- 左转 向右箭头(或 D)- 右转 要牵引车辆,请倒车至带有红点的末端。当距离足够近时,您的拖拉机将自动连接。 车辆可以被推动,但牵引时要小心,因为它们状况不佳,有时会爆炸。 将车辆拖回废品...

    拖拉机GPS卫星导航自动驾驶技术的应用.pdf

    标题:“拖拉机GPS卫星导航自动驾驶技术的应用” 知识点说明: 一、拖拉机GPS卫星导航自动驾驶技术简介 GPS卫星导航技术是一种全球定位系统技术,近年来在农业领域得到了广泛的应用。该技术可以实现农业机械如...

    2+TLZ【源码】数据可视化:基于Echarts+PyQT+Flask实现的动态实时【拖拉拽大屏】-数据中心.zip

    Echarts/PyQT/Flask实现的 动态实时拖拉拽大屏 ,重点的事情说三遍:自定义拖拉拽,自定义拖拉拽,自定义拖拉拽!!! YYDatav的数据可视化大屏《精彩案例汇总》(Python&Echarts源码) ... ...YYDatav的数据可视化大屏...

    HTML5 js实现拖拉上传文件功能

    HTML5的拖拉上传功能是现代网页开发中的一个重要特性,它允许用户通过拖放操作将文件从本地文件系统直接上传到网页。这个功能极大地提升了用户体验,简化了传统的文件选择过程。下面我们将详细讨论如何利用HTML5和...

    菜单拖拉(图片的拖拉).zip

    总的来说,"菜单拖拉(图片的拖拉).zip"项目展示了HTML5的拖放API、CSS3的交互样式以及JavaScript的DOM操作在构建动态Web应用中的重要作用。通过学习和理解这些技术,开发者能够创建更加生动、用户友好的网页应用。

    winCE小游戏-拖拉机

    标题中的“winCE小游戏-拖拉机”表明这是一个在Windows CE操作系统上的小型游戏应用,主要是一款拖拉机游戏。Windows CE是一种微软开发的嵌入式操作系统,常用于掌上设备、工业控制设备以及早期的智能手机等。这款小...

Global site tag (gtag.js) - Google Analytics