HTML5应用之文件上传

掌握HTML文件上传:从基础到高级技巧 HTML中的<input type="file">标签是实现文件上传功能的核心组件。通过设置type="file",用户可以选择本地文件进行上传。常用属性包括accept(限制文件类型)、multiple(允许多文件上传)、capture(优先使用摄像头或麦克风)和required(必须选择文件)。表单需配置enctype="multipart/form-data"和method="POST"以确保文件正确上传。Ja 阅读详情

HTML5解决了以往网页编写的一个难题:带有上传进度的文件上传。

本文的代码全部来自http://www.matlus.com/html5-file-upload-with-progress/,如在技术细节上有任何疑问,请以原文为主。

长期以来,开发者们一直为此苦恼,大部分为解决这个问题都采用了flash作为解决方案,但flash并非灵丹妙药,因为flash版本,割据造成的问题有时反倒成为了噩梦。有些网站则采用了form标签的enctype=multipart/form-data属性,但这一属性要求服务器作出特殊的设置才能够显示进度,而且本身也比较复杂,复杂就意味着容易出现错误,这可不是我们想要的。

现在我们来看看HTML5为什么能够解决这个问题,以及,它到底能做的多好。

用HTML5上传文件

在HTML5标准中,XMLHttpRequest对象被重新定义,被称为“XMLHttpRequest Level 2”,其中包含了以下5个新特性:

  • 支持上传、下载字节流,比如文件、blob以及表单数据
  • 增加了上传、下载中的进度事件
  • 跨域请求的支持
  • 允许发送匿名请求(即不发送HTTP的Referer部分)
  • 允许设置请求的超时

在这篇教程中,我们主要关注第一和第二项特性,尤其是第二项——它能够提供我们想要的上传进度。和之前的方案不同,这个方案并不要求服务器作出特殊的设置,因此大家边看教程就可以边动手试试了。
HTML5上传文件

HTML5上传文件结束

上面图示的就是我们能够实现的内容:

  • 显示上传的文件信息,比如文件名、类型、尺寸
  • 一个能够显示真实进度的进度条
  • 上传的速度
  • 剩余时间的估算
  • 已上传的数据量
  • 上传结束后服务器返回的响应

另外,凭借XMLHttpRequest,我们的上传过程整个都是异步的,因此用户在上传文件的时候,依然可以操作网页当中的其它元素,并不需要专门等待上传的完成。而在上传结束后,我们能够获取服务器发回的响应,因此整个上传过程都显得相当顺理成章。

HTML5的进度事件

HTML5当中新增了一个进度事件(Progress Events),这个事件为我们提供了以下信息:

  • total – 文件大小
  • loaded – 已上传的大小
  • lengthComputable – 进度是否可计算

信息并不多,但是在计算文件进度上已经足够了。当然,也还有很多东西它没有直接给出,这非常遗憾。

HTML

与普通的文件上传代码并没有太大差异。不过注意,input标签关联了一个JavaScript函数在onchange上。

<!DOCTYPE html>
<html>
<head>
    <title>使用XMLHttpRequest上传文件</title>
</head>
<body>
<form id="form1" enctype="multipart/form-data" method="post" action="upload.php">
<div class="row">
      <label for="fileToUpload">Select a File to Upload</label>
<input type="file" name="fileToUpload" id="fileToUpload" onchange="fileSelected();"/>
    </div>
<div id="fileName"></div>
<div id="fileSize"></div>
<div id="fileType"></div>
<div class="row">
<input type="button" onclick="uploadFile()" value="Upload" />
    </div>
<div id="progressNumber"></div>
</form>

</body>
</html>

JavaScript

一旦我们在HTML中使用了input,我们就可以在JS代码中获取到一个FileList对象。这个对象是HTML5中新增加的文件API中的一部分,每一个FileList对象都是一组文件对象的集合,而文件对象则拥有下列的属性:

  • name – 文件名(不包含路径)
  • type – 文件的MIME类型(小写)
  • size – 文件的尺寸(单位为字节)

这正是我们所需要的。当然,HTML5中还有一个FileReader对象,但在这里我们并没有用它。现在,通过上面的三个内容,我们已经能够控制用户上传的文件大小和文件类型,以便减轻服务器再次检测时的压力,并提升安全系数。

function fileSelected() {
  var file = document.getElementById('fileToUpload').files[0];
  if (file) {
    var fileSize = 0;
    if (file.size > 1024 * 1024)
      fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
    else
      fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';

    document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
    document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
    document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
  }
}

那么当用户选择好文件,点击上传之后,又将发生什么呢?

function uploadFile() {
  var xhr = new XMLHttpRequest();
  var fd = document.getElementById('form1').getFormData();

  /* event listners */
  xhr.upload.addEventListener("progress", uploadProgress, false);
  xhr.addEventListener("load", uploadComplete, false);
  xhr.addEventListener("error", uploadFailed, false);
  xhr.addEventListener("abort", uploadCanceled, false);
  /* Be sure to change the url below to the url of your upload server side script */
  xhr.open("POST", "upload.php");
  xhr.send(fd);
}

function uploadProgress(evt) {
  if (evt.lengthComputable) {
    var percentComplete = Math.round(evt.loaded * 100 / evt.total);
    document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
  }
  else {
    document.getElementById('progressNumber').innerHTML = 'unable to compute';
  }
}

function uploadComplete(evt) {
  /* This event is raised when the server send back a response */
  alert(evt.target.responseText);
}

function uploadFailed(evt) {
  alert("There was an error attempting to upload the file.");
}

function uploadCanceled(evt) {
  alert("The upload has been canceled by the user or the browser dropped the connection.");
}

在代码的第二行中,我们的JS代码又使用了另一个HTML5推出的新对象——FormData。FormData对象是用户的表单数据的集合,它以键值对的形式存储了表单数据,其值能够包括数字、字符串以及文件。我们通过辗转这个对象,来向服务器提交数据。

当然,这个对象我们也可以在代码中手工构建,比如说像下面这样:

var fd = new FormData();
fd.append("author", "Shiv Kumar");
fd.append("name", "Html 5 File API/FormData");
fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);

回到正题。回顾上一段代码,我们增加了许多有关XMLHttpRequest的事件监听,其目的是为了获取文件上传的真实情况。尤其需要注意的是,我们所挂钩的,并不是XMLHttpRequest本身,而是其属性,比如uploadProgress。

完整代码

最后,来看看完整的代码。

<!DOCTYPE html>
<html>
<head>
    <title>Upload Files using XMLHttpRequest - Minimal</title>

    <script type="text/javascript">
      function fileSelected() {
        var file = document.getElementById('fileToUpload').files[0];
        if (file) {
          var fileSize = 0;
          if (file.size > 1024 * 1024)
            fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
          else
            fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';

          document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
          document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
          document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
        }
      }

      function uploadFile() {
        var fd = new FormData();
        fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener("progress", uploadProgress, false);
        xhr.addEventListener("load", uploadComplete, false);
        xhr.addEventListener("error", uploadFailed, false);
        xhr.addEventListener("abort", uploadCanceled, false);
        xhr.open("POST", "UploadMinimal.aspx");
        xhr.send(fd);
      }

      function uploadProgress(evt) {
        if (evt.lengthComputable) {
          var percentComplete = Math.round(evt.loaded * 100 / evt.total);
          document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
        }
        else {
          document.getElementById('progressNumber').innerHTML = 'unable to compute';
        }
      }

      function uploadComplete(evt) {
        /* This event is raised when the server send back a response */
        alert(evt.target.responseText);
      }

      function uploadFailed(evt) {
        alert("There was an error attempting to upload the file.");
      }

      function uploadCanceled(evt) {
        alert("The upload has been canceled by the user or the browser dropped the connection.");
      }
    </script>
</head>
<body>
<form id="form1" enctype="multipart/form-data" method="post" action="upload.php">
<div class="row">
      <label for="fileToUpload">Select a File to Upload</label>
<input type="file" name="fileToUpload" id="fileToUpload" onchange="fileSelected();"/>
    </div>
<div id="fileName"></div>
<div id="fileSize"></div>
<div id="fileType"></div>
<div class="row">
<input type="button" onclick="uploadFile()" value="Upload" />
    </div>
<div id="progressNumber"></div>
</form>

</body>
</html>

我们的任务完成了吗?可以说完成了,因为这段代码已经能够完成上传文件的任务,而且也能够显示上传的进度;但是理应说我们没有,因为除了这个骨架HTML之外,我们还有很多没有做的事情,比如CSS的美化等等。不过这就不是我们这篇文章的主题了。

最后,提醒一下,教程的代码应当在支持新特性的浏览器之上运行,如果你不清楚自己的浏览器是否支持,可以在这里查询。

HTML5文件上传功能(H5):实现文件上传功能的HTML5标签 综上所述,使用HTML5的文件上传功能,我们可以轻松地在网页中实现文件上传功能。通过合适的服务器端脚本,我们可以对上传的文件进行处理和存储,以满足特定的需求。请注意,上述示例中的服务器端脚本是使用PHP编写的,对于其他编程语言,处理文件上传的方法可能会有所不同。最后,如果所有的检查都通过了,我们将文件移动到指定的目录中(在这个例子中是。需要注意的是,这只是一个简单的示例,实际应用中可能需要进行更多的检查和处理。在上面的示例代码中,我们创建了一个简单的HTML表单,其中包含一个文件选择输入框和一个提交按钮。 阅读详情

相关推荐

HTML实现文件上传

name属性用于指定文件输入框的名称,这个名称将在后端脚本中用于访问上传的文件。在上述示例中,当用户选择一个文件并点击"上传文件"按钮时,表单数据将被发送到服务器端脚本"upload.php"进行处理。在上面的代码中,我们创建了一个表单(form)元素,并设置了action属性为"upload.php",这意味着在提交表单时,表单数据将被发送到名为"upload.php"的服务器端脚本进行处理。请注意,文件上传涉及到安全性和文件验证等方面的考虑,因此在实际应用中,您可能需要进行更多的验证和处理。

CyberGenius的博客 1595

15HTML5 文件上传

文章目录1、文件上传获取文件信息限制文件的上传类型 在之前我们操作本地文件都是使用 flash、silverlight 或者第三方的 activeX 插件等技术,由于使用了这些技术后就很难进行跨平台、或者跨浏览器、跨设备等情况下实现统一的表现,从另外一个角度来说就是让我们的 web 应用依赖了第三方的插件,而不是很独立。 在 HTML5 标准中,默认提供了操作文件的 API 让这一切直接标准化。有了操作文件的 API,让我们的 Web 应用可以很轻松的通过 JS 来控制文件的读取、写入、文件夹、文件等一系列

Blog of Lytracy 1496

HTML5表单与画布绘图的探索

本文深入探讨了HTML5表单的创建和文件上传处理,以及如何使用JavaScript在HTML5文档中动态绘制图像。通过实例代码和详细说明,展示了表单元素的配置方法,以及画布元素的使用技巧,包括如何设置画布、绘制形状和文本,以及如何处理文件上传。

weixin_42593549的博客 398

HTML5文件上传操作

在 HTML5 出现之前,在 Web 上没有文件创建和复制,也没有文件处理,HTML5 规范中包含 3 个文件相关的规范:“文件 API”“文件 API:目录和系统”以及“文件 API:写入器”,文件 API 包含 File 对象、FileList 对象和 FileReader 对象。File 对象继承了 Blob 对象或者说是一种特殊的 Blob 对象,所有可以使用Blob 对象的场合都可以使用。FileList 对象是一个类似于数组的对象,代表一组选中的文件,每个成员都是一个 File 实例。

weixin_45525177的博客 348

HTML5与SVG打造的现代文件上传UI体验

在当今的网络应用开发中,HTML5文件上传功能已成为必不可少的组成部分。它的出现极大地提升了用户的交互体验,允许用户直接在浏览器端上传文件到服务器。文件上传功能的实现,不仅简化了数据交换的过程,还增强了Web应用的可用性和灵活性。HTML5 File API为开发者提供了与本地文件系统交互的能力,这是通过定义一系列接口来实现的。有了这些API,Web应用可以在不需要后端参与的情况下直接读取、修改并操作本地文件。File API的主要组成部分包括:FileList。

weixin_42601608的博客 1224

Ubuntu24.04/20.04设置网络共享文件夹

Ubuntu20.04利用向日葵远程控制时,不能传输文件。使用linux版本QQ来传输是可以的,不过linuxqq功能真的很弱。因此,打算在Ubuntu系统中建立一个共享文件夹,可在局域网中访问。 1、新建共享文件夹 获取root权限,或者登陆root账户。可在/home文件夹(或其它文件夹)下新建一个文件夹,如share。 右击文件夹,选择“本地网络共享”菜单。按下图设置。 点击确定。如果系统已经安装了samba服务器,就可以进入第3步。如果没有,会提示安装,按提示安装,可能会出错,可进.

willhu2008的专栏 2万+

html 5原生的文件上传,HTML5应用之文件上传

长期以来,开发者们一直为此苦恼,大部分为解决这个问题都采用了flash作为解决方案,但flash并非灵丹妙药,因为flash版本,割据造成的问题有时反倒成为了噩梦。有些网站则采用了form标签的enctype=multipart/form-data属性,但这一属性要求服务器作出特殊的设置才能够显示进度,而且本身也比较复杂,复杂就意味着容易出现错误,这可不是我们想要的。现在我们来看看Html5为什么...

weixin_39703551的博客 675

Linux单独编译设备树,开发者分享 | Petalinux 工程中设备树的介绍

本文来自XILINX嵌入式产品应用工程师 Terry Ni设备树是 Petalinux kernel 的关键组件,接下来以 2020.1 版本为例,为大家介绍一下在Xilinx Petalinux 工程中的设备树是如何产生,配置以及修改的。Petalinux 工程中设备树的位置当我们创建了一个 petalinux 工程后(以zcu102为例),在编译的时候,会自动生成对应的设备树文件。这些设备树的...

weixin_28877107的博客 2592

[转] HTML5应用之文件上传

HTML5解决了以往网页编写的一个难题:带有上传进度的文件上传。 本文的代码全部来自http://www.matlus.com/html5-file-upload-with-progress/,如在技术细节上有任何疑问,请以原文为主。 长期以来,开发者们一直为此苦恼,大部分为解决这个问题都采用了flash作为解决方案,但flash并非灵丹妙药,因为flash版本,割据造成的问题有时反倒成为了噩...

weixin_34221073的博客 100

Stata森林图进阶:个性化定制与高级技巧

本文详细介绍了Stata森林图的进阶技巧,包括个性化定制与高级应用。通过meta分析工具如metan命令,用户可以优化字体、颜色、坐标轴等视觉元素,提升森林图的专业性和可读性。文章还提供了黑白印刷设置、高分辨率导出等实用技巧,帮助科研人员制作符合学术出版要求的森林图。

ios99的博客 254

保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)

本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。

weixin_30619101的博客 513

layui多文件上传讲解_layui文件上传的实际应用实例

PHP文件上传在实际应用中非常常见, 然单独写上传是很麻烦的, 原生的表单上传用户体验性也非常差, 这里通过layui文件上传插件与TP的文件上传类进行结合, 实例方便好用的文件上传操作。1. 到layui官方网站下载layui插件2. 加载layui.css及layui.js文件3. HTML应用上传图片 //点击上传图片上传图片显示 //上传图片后返回的文件名4. layui应用://一般...

weixin_39926311的博客 1132

解密微信视频号推荐算法的三大核心机制

本文深入解析微信视频号推荐算法的三大核心机制:用户行为数据、视频内容质量和社交关系链。通过详细的数据分析和实战测试,揭示算法如何根据完播率、互动深度、原创性检测和社交关系等因素决定内容推荐。帮助用户和创作者更好地理解并利用视频号算法,提升内容曝光和观看体验。

weixin_42573113的博客 1786

纯html5上传文件_纯HTML5文件上传

纯html5上传文件Pure HTML5 file upload HTML5 upload tutorial: today we will develop a great HTML5 file upload form with progress bar and preview (at client-side). We have already gave you jQuery based solut...

cukeoumuqian0413的博客 1024

半导体设备微振动控制:天棚阻尼PID与SIMULINK建模实战

半导体制造设备对微振动的敏感度已进入纳米级,光刻机、量测设备等一旦遭遇超过VC-C振动准则的扰动,便会出现套刻误差或检测误判。主动隔振技术通过传感器、控制器与执行器形成闭环,能有效抑制低频共振,其中天棚阻尼控制因物理概念清晰、鲁棒性强而成为工程首选。结合MATLAB/SIMULINK建模,可在设计阶段完成系统性能边界评估与参数整定,再通过C代码生成与FMU导出实现算法向控制器和跨平台仿真迁移。本文从VC-C指标拆解出发,依次讲解天棚阻尼PID控制原理、两自由度被控对象建模、控制增益估算、仿真验证方法,并给出

weixin_29169505的博客 326

AJAX文件上传实践与分析,带HTML5文件上传API。

  对于HTML5已经支持AJAX文件上传了,但如果需要兼容的话还是得用一点小技巧的,HTML5等等介绍,先来看看以前我们是怎么写的。   网上可能会有一些叫AJAX文件上传插件,但在AJAX2.0之前是不可能实现的,因为浏览器的原因,AJAX根本获取不了文件信息,当然这里并不是说就不能文件上传了,只是说在AJAX2.0之前所谓的AJAX文件上传都是假冒的,核心更本没有用AJAX,而是利用iframe实现的,下面我们来看看如何利用iframe实现页面无刷新上传文件。 iframe无刷新上传文件版。 ht.

liudanyang_21的博客 206

《唤醒你的AI同事:WorkBuddy从零上手》004:与其他 AI 工具的对比

把 WorkBuddy 与聊天机器人、办公套件内置 AI、自动化工具逐维对比,并按当前版本补充四项新差距:结果交付、连接器广度、资料库与多模态产出。

LuckyHanMo的博客 671

HTML5使用 JavaScript File API 实现文件上传

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件来源:http:/

hftyfdg的博客 422

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

html5经典教程,40个经典HTML5实例教程.pdf

40个经典HTML5实例教程40 个经典HTML5 实例教程在这个教程列表上我们为您收集了最具有代表性的各类型HTML5 教程,它们会帮助你更好的利用html5 来优化完善你的web 项目,而且让人惊喜的是HTML5 的一些热门特性都在这!些案例里面体现出来了,相信这些前沿的交互细节会为你的项目锦上添花教程都很详细,您可以按着它们的详细指南一步步制作,来挑选你的法宝吧。Making a Beaut...

weixin_39880490的博客 649

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

html实现上传

在本文中,我们介绍了如何使用HTML5技术来实现文件上传功能,可以使用form表单或者JavaScript、jQuery来实现。在web应用程序的开发中,文件上传功能已经成为了标配之一,掌握好文件上传的实现方法可以提高我们的开发效率。在上面这个表单中,我们使用了enctype="multipart/form-data"来指定表单的编码类型,在文件上传时使用multipart/form-data的编码方式。在HTML5中,文件上传可以使用HTML的form表单提交功能来实现。HTML5中的文件上传。

weixin_45525177的博客 293

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

HTML5新增API

HTML5新增API检查网络连接状态 检查网络连接状态 $(function() { //online和offline是H5新增的两个事件,用来监听网络连接状态的,所以jQuery是不支持用事件名函数的 $(window).on('online',function(){ //delay() 方法对队列中的下一项的执行设置延迟。 $('.tips').text('网络已连接!').fadeIn(500).delay(1000).fadeOut(500); }) $(wind

JAVA & HTML 882
上一篇: jquery 删除字符串最后一个字符的方法
下一篇: HTML5中使用JSON对象存取数据
小米哥Gui林
博客等级 码龄16年 53粉丝 30原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值