广告
返回顶部
首页 > 资讯 > 前端开发 > html >HTML5应用之文件上传的示例分析
  • 253
分享到

HTML5应用之文件上传的示例分析

2024-04-02 19:04:59 253人浏览 八月长安
摘要

这篇文章主要介绍HTML5应用之文件上传的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用HTML5上传文件在html5标准中,XMLHttpRequest对象被重新定义,被

这篇文章主要介绍HTML5应用之文件上传的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

用HTML5上传文件

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

1、支持上传、下载字节流,比如文件、blob以及表单数据

2、增加了上传、下载中的进度事件

3、跨域请求的支持

4、允许发送匿名请求(即不发送HTTP的Referer部分)

5、允许设置请求的超时

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

HTML5应用之文件上传的示例分析

HTML5应用之文件上传的示例分析

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

1、显示上传的文件信息,比如文件名、类型、尺寸

2、一个能够显示真实进度的进度条

3、上传的速度

4、剩余时间的估算

5、已上传的数据量

6、上传结束后服务器返回的响应

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

HTML5的进度事件

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

1、total – 文件大小

2、loaded – 已上传的大小

3、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对象都是一组文件对象的集合,而文件对象则拥有下列的属性:

1、name &ndash; 文件名(不包含路径)

2、type &ndash; 文件的MIME类型(小写)

3、size &ndash; 文件的尺寸(单位为字节)

这正是我们所需要的。当然,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();

  
  xhr.upload.addEventListener("progress", uploadProgress, false);
  xhr.addEventListener("load", uploadComplete, false);
  xhr.addEventListener("error", uploadFailed, false);
  xhr.addEventListener("abort", uploadCanceled, false);
  
  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) {
  
  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推出的新对象&mdash;&mdash;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) {
        
        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>

以上是“HTML5应用之文件上传的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网html频道!

--结束END--

本文标题: HTML5应用之文件上传的示例分析

本文链接: https://www.lsjlt.com/news/70010.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • HTML5应用之文件上传的示例分析
    这篇文章主要介绍HTML5应用之文件上传的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用HTML5上传文件在HTML5标准中,XMLHttpRequest对象被重新定义,被...
    99+
    2022-10-19
  • jQuery.Form上传文件的示例分析
    小编给大家分享一下jQuery.Form上传文件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!建立test文件夹PHP...
    99+
    2022-10-19
  • SpringMVC上传文件FileUpload的示例分析
    这篇文章将为大家详细讲解有关SpringMVC上传文件FileUpload的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下我是在已经搭建好的springMVC环境下,maven工程中的...
    99+
    2023-05-30
    springmvc fileupload
  • 前端上传文件的示例分析
    这篇文章将为大家详细讲解有关前端上传文件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。零, 基础(知识点主要来源于w3school)(已经熟悉的人直接跳过这一章...
    99+
    2022-10-19
  • PHP中文件上传的示例分析
    小编给大家分享一下PHP中文件上传的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PH...
    99+
    2023-06-14
  • php中文件上传至OSS的示例分析
    小编给大家分享一下php中文件上传至OSS的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!删除的时候记住不要带域名,也不要带'/'这个路径...
    99+
    2023-06-20
  • Nodejs中文件上传、监听上传进度的示例分析
    这篇文章主要为大家展示了“Nodejs中文件上传、监听上传进度的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Nodejs中文件上传、监听上传进度的示例...
    99+
    2022-10-19
  • css中input上传文件样式的示例分析
    这篇文章主要介绍css中input上传文件样式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果:<!doctype html>  ...
    99+
    2022-10-19
  • JavaWeb文件上传实例分析
    这篇文章主要介绍“JavaWeb文件上传实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaWeb文件上传实例分析”文章能帮助大家解决问题。文件上传实际上...
    99+
    2022-10-19
  • jQuery无刷新上传之uploadify的示例分析
    这篇文章给大家分享的是有关jQuery无刷新上传之uploadify的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图一:从官网下载开发包添加到项目中,我对这个开发包...
    99+
    2022-10-19
  • android文件上传示例分享(android图片上传)
    主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中。 主Activity 代码如下:package com.guoto...
    99+
    2022-06-06
    示例 Android
  • SpringBoot文件上传大小设置方式的示例分析
    这篇文章主要介绍SpringBoot文件上传大小设置方式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!文件上传大小设置#文件大小 MB必须大写#  maxFileSize&nb...
    99+
    2023-06-29
  • SpringBoot文件分片上传的示例代码
    目录背景文件MD5计算文件分片切割文件分片接收检查分片保存分片合并分片云文件分片上传阿里云OSS华为云OBSMinio背景 最近好几个项目在运行过程中客户都提出文件上传大小的限制能否...
    99+
    2022-11-12
  • Android WebView那些坑之上传文件示例
    最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片。 解决问题之前我们先来说说WebView上传文件的逻辑:...
    99+
    2022-06-06
    示例 上传文件 webview Android
  • RxJava加Retrofit文件分段上传示例
    目录前言问题拆解分块并发读取文件文件片段上传完整代码前言 本文基于 RxJava 和 Retrofit 库,设计并实现了一种用于大文件分块上传的工具,并对其进行了全面的拆解分析。抛砖...
    99+
    2023-01-03
    RxJava Retrofit文件上传 RxJava Retrofit
  • javascript之分片上传,断点续传的实际项目的示例分析
    小编给大家分享一下javascript之分片上传,断点续传的实际项目的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!总所...
    99+
    2022-10-19
  • javascript头像上传的示例分析
    这篇文章主要为大家展示了“javascript头像上传的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript头像上传的示例分析”这篇文章吧...
    99+
    2022-10-19
  • HTML5中FileReader分布读取文件的示例分析
    这篇文章给大家分享的是有关HTML5中FileReader分布读取文件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先上效果图先介绍一下H5中FileReader的一些...
    99+
    2022-10-19
  • webpack之webpack.config.js配置文件的示例分析
    这篇文章主要为大家展示了“webpack之webpack.config.js配置文件的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“webpack之we...
    99+
    2022-10-19
  • vue组件之间数据传递的示例分析
    小编给大家分享一下vue组件之间数据传递的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!(1)props属性:在父组件中,可以通过子组件标签属性的形式将数据或者函数传给子组件,子组...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作