首页 > 其他分享 >HTML5 文件上传下载的实例代码

HTML5 文件上传下载的实例代码

时间:2023-12-15 10:11:56浏览次数:31  
标签:files 文件 对象 上传下载 实例 HTML5 var image Blob

前言

HTML5 中提供的文件API在前端中有着丰富的应用,上传、下载、读取内容等在日常的交互中很常见。而且在各个浏览器的兼容也比较好,包括移动端,除了 IE 只支持 IE10 以上的版本。想要更好地掌握好操作文件的功能,先要熟悉每个API。

FileList 对象和 file 对象

HTML 中的 input[type="file"] 标签有个 multiple 属性,允许用户选择多个文件,FileList对象则就是表示用户选择的文件列表。这个列表中的每一个文件,就是一个 file 对象。

  1. file 对象的属性:
  2. name : 文件名,不包含路径。
  3. type : 文件类型。图片类型的文件都会以 image/ 开头,可以由此来限制只允许上传图片。
  4. size : 文件大小。可以根据文件大小来进行其他操作。
  5. lastModified : 文件最后修改的时间。
<input type="file" id="files" multiple> <script>     var elem = document.getElementById('files');     elem.onchange = function (event) {         var files = event.target.files;         for (var i = 0; i < files.length; i++) {             // 文件类型为 image 并且文件大小小于 200kb             if(files[i].type.indexOf('image/') !== -1 && files[i].size < 204800){                 console.log(files[i].name);             }         }     } </script>

input 中有个 accept 属性,可以用来规定能够通过文件上传进行提交的文件类型。

accept="image/*" 可以用来限制只允许上传图像格式。但是在 Webkit 浏览器下却出现了响应滞慢的问题,要等上好几秒才弹出文件选择框。

解决方法就是将 * 通配符改为指定的 MIME 类型。

<input type="file" accept="image/gif,image/jpeg,image/jpg,image/png">

Blob 对象

Blob 对象相当于一个容器,可以用于存放二进制数据。它有两个属性,size 属性表示字节长度,type 属性表示 MIME 类型。

如何创建

Blob 对象可以使用 Blob() 构造函数来创建。

var blob = new Blob(['hello'], {type:"text/plain"});

Blob 构造函数中的第一个参数是一个数组,可以存放 ArrayBuffer对象、ArrayBufferView 对象、Blob对象和字符串。

Blob 对象可以通过 slice() 方法来返回一个新的 Blob 对象。

var newblob = blob.slice(0,5, {type:"text/plain"});

slice() 方法使用三个参数,均为可选。第一个参数代表要从Blob对象中的二进制数据的起始位置开始复制,第二个参数代表复制的结束位置,第三个参数为 Blob 对象的 MIME 类型。

canvas.toBlob() 也可以创建 Blob 对象。toBlob() 使用三个参数,第一个为回调函数,第二个为图片类型,默认为 image/png,第三个为图片质量,值在0到1之间。

var canvas = document.getElementById('canvas'); canvas.toBlob(function(blob){ console.log(blob); }, "image/jpeg", 0.5);

下载文件

Blod 对象可以通过 window.URL 对象生成一个网络地址,结合 a 标签的 download 属性来实现下载文件功能。

比如把 canvas 下载为一个图片文件。

var canvas = document.getElementById('canvas'); canvas.toBlob(function(blob){     // 使用 createObjectURL 生成地址,格式为 blob:null/fd95b806-db11-4f98-b2ce-5eb16b38ba36     var url = URL.createObjectURL(blob);     var a = document.createElement('a');     a.download = 'canvas';     a.href = url;     // 模拟a标签点击进行下载     a.click();     // 下载后告诉浏览器不再需要保持这个文件的引用了     URL.revokeObjectURL(url); });

也可以将字符串保存为一个文本文件,方法类似。

FileReader 对象

FileReader 对象主要用来把文件读入内存,并且读取文件中的数据。通过构造函数创建一个 FileReader 对象

var reader = new FileReader();

该对象有以下方法:

  1. abort:中断读取操作。
  2. readAsArrayBuffer:读取文件内容到ArrayBuffer对象中。
  3. readAsBinaryString:将文件读取为二进制数据。
  4. readAsDataURL:将文件读取为data: URL格式的字符串。
  5. readAsText:将文件读取为文本。

上传图片预览

在常见的应用就是在客户端上传图片之后通过 readAsDataURL() 来显示图片。

<input type="file" id="files" accept="image/jpeg,image/jpg,image/png"> <img src="blank.gif" id="preview"> <script>     var elem = document.getElementById('files'),         img = document.getElementById('preview');     elem.onchange = function () {         var files = elem.files,             reader = new FileReader();         if(files && files[0]){             reader.onload = function (ev) {                 img.src = ev.target.result;             }             reader.readAsDataURL(files[0]);         }     } </script>

但是在一些手机上竖着拍照上传照片时会有bug,会发现照片倒了,包括三星和iPhone。。。解决方案这里不做讲解,有兴趣可以查看:移动端图片上传旋转、压缩的解决方案

数据备份与恢复

FileReader 对象的 readAsText() 可以读取文件的文本,结合 Blob 对象下载文件的功能,那就可以实现将数据导出文件备份到本地,当数据要恢复时,通过 input 把备份文件上传,使用 readAsText() 读取文本,恢复数据。

代码跟上面功能类似,这里不重复,具体的应用可以参考:notepad

Base64 编码

在 HTML5 中新增了 atob 和 btoa 方法来支持 Base64 编码。它们的命名也很简单,b to a 和 a to b,即代表着编码和解码。

var a = "https://lin-xin.github.io"; var b = btoa(a); var c = atob(b);   console.log(a);     // https://lin-xin.github.io console.log(b);     // aHR0cHM6Ly9saW4teGluLmdpdGh1Yi5pbw== console.log(c);     // https://lin-xin.github.io

btoa 方法对字符串 a 进行编码,不会改变 a 的值,返回一个编码后的值。

atob 方法对编码后的字符串进行解码。

但是参数中带中文,已经超出了8位ASCII编码的字符范围,浏览器就会报错。所以需要先对中文进行 encodeURIComponent 编码处理。

var a = "哈喽 世界"; var b = btoa(encodeURIComponent(a)); var c = decodeURIComponent(atob(b));   console.log(b);     // JUU1JTkzJTg4JUU1JTk2JUJEJTIwJUU0JUI4JTk2JUU3JTk1JThD console.log(c);     // 哈喽 世界

以上就是本文的全部内容,希望对大家的学习有所帮助

 

参考文章:http://blog.ncmem.com/wordpress/2023/12/15/html5-%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e4%b8%8b%e8%bd%bd%e7%9a%84%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81/

欢迎入群一起讨论

 

 

标签:files,文件,对象,上传下载,实例,HTML5,var,image,Blob
From: https://www.cnblogs.com/songsu/p/17902758.html

相关文章

  • HTML5之FileReader的使用
    HTML5之FileReader的使用:https://blog.csdn.net/jackfrued/article/details/8967667?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-8967667-blog-108661993.235%5Ev39%5Epc_relevant_3m_sort_dl_base2&d......
  • AWS云服务器EC2实例实现ByConity快速部署
    1.前言亚马逊是全球最大的在线零售商和云计算服务提供商。AWS云服务器在全球范围内都备受推崇,被众多业内人士誉为“云计算服务的行业标准”。在国内,亚马逊AWS也以其卓越的性能和服务满足了众多用户的需求,拥有着较高的市场份额和竞争力。同时也是出海用户的首选云服务。作为一款主......
  • 宣布全面推出适用于 macOS 的 Amazon EC2 M2 Pro Mac 实例
    即日起,AmazonElasticComputeCloud(AmazonEC2)M2ProMac实例现已全面推出(GA)。在为Apple平台(例如iOS、macOS、iPadOS、tvOS、watchOS、visionOS和Safari)构建和测试应用程序时,这些实例的性能比现有的M1Mac实例提高了35%。M2ProMac实例由AmazonNitroSystem......
  • 基于SpringBoot实现文件的上传下载
    (一)概述文件上传下载一直都是一个系统最常用也是最基本的功能点,刚好最近公司的项目上有用到这个功能,于是自己就用SpringBoot也写了一个简化的版本,已实现文件的上传和下载功能。(二)创建项目首先创建一个SpringBoot的项目,接着引入相关的依赖,因为涉及到数据库的操作,所以依赖会比较多一些......
  • springboot实现文件的上传下载
    SpringBoot提供了简单易用的方式来处理文件上传和下载功能。下面是一个简单的示例:创建一个文件上传的控制器@RestControllerpublicclassFileUploadController{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(FileUploadController.class);@PostMappi......
  • 28-3 QINQ配置实例
    基本QINQ拓扑通过QINQ技术防止内网VLAN和公网VLAN冲突,又保证正常内网之间的业务流量通信配置LSW4#vlanbatch10#interfaceGigabitEthernet0/0/1portlink-typetrunkporttrunkallow-passvlan10#interfaceGigabitEthernet0/0/2portlink-typeaccesspo......
  • 前端学习笔记DAY2 HTML5基础(2)(b站pink老师)
    二.HTML标签4.HTML常用标签4.1标签语义学习标签的重点是记住每个标签的语义。就是指标签的含义,即这个标签是用来干嘛的。根据标签的语义,在合适的地方给一个最为合理的标签,可以让页面结构更清晰。※4.2标题标签<h1>-<h6>HTML提供了6个等级的网页标题,即<h1>-<h6>。......
  • Java并发(十八)----常见线程安全类及实例分析
    1、常见线程安全类StringIntegerStringBufferRandomVectorHashtablejava.util.concurrent(JUC)包下的类这里说它们是线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。Hashtabletable=newHashtable();​newThread(()->{  ......
  • 《实例化需求》读后感
    该书拥有众多的例子和建议,其中的50多个案例分析验证了不同的团队和组织通过采用该方法取得了不同程度的成功。作者并没有掩饰在引进该方法时所面临的挑战,通过分析那些失败案例所具有的模式和范例,给出了一些避免失败的建议。作者不仅通过案例分析和举例辨识出团队在引进实例化需求......
  • 你知道如何修改ASP.NET Core默认端口吗?常用5种方法实例演示
    下面针对ASP.NETCore中修改默认端口的五种常用方法的详细示例,分别对应 appsettings.json 配置Kestrel的Endpoint、使用 UseUrls 方法、命令行参数方法、host.json 配置方法和使用Docker的方式。方法一:appsettings.json配置Kestrel的Endpoint在 appsettings.j......