目标导航:

接上一篇文章:https://blog.csdn.net/weixin_44797182/article/details/100584598

4,FileReader对象(方法 事件)
    4,1使用方法

5,blod对象

6,文件拖拽 =》从浏览器外获取数据
    6.1,拖拽读取文件信息–使用dataTransfer
    6.2拖拽显示图片及信息–使用blob对象

4,FileReader对象

FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件。简单的理解就是文件读取

使用FileReader对象,web应用程序可以异步的读取存储在用户计算机上的文件(或者原始数据缓冲)内容,可以使用File对象或者Blob对象来指定所要处理的文件或数据。

方法

需要注意的是 ,无论读取成功或失败,方法并不会返回读取结果,这一结果存储在 result属性中。

方法定义 描述
abort():void 终止文件读取操作
readAsArrayBuffer(file):void 异步按字节读取文件内容,结果用ArrayBuffer对象表示
readAsBinaryString(file):void 异步按字节读取文件内容,结果为文件的二进制串
readAsDataURL(file):void 异步读取文件内容,结果用data:url的字符串形式表示
readAsText(file,encoding):void 异步按字符读取文件内容,结果用字符串形式表示
事件
事件名称 描述
onabort 当读取操作被中止时调用
onerror 当读取操作发生错误时调用
onload 当读取操作成功完成时调用
onloadend 当读取操作完成时调用,不管是成功还是失败
onloadstart 当读取操作将要开始之前调用
onprogress 在读取数据过程中周期性调用

readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。

readAsBinaryString:该方法将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。

readAsDataURL:这是例子程序中用到的方法,该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URL,Data URL是一种将小文件直接嵌入文档的方案。这里的小文件通常是指图像与 html 等格式的文件。(其中base64的方式就是由此来获得的。。)

文件一旦开始读取,无论成功或失败,实例的 result 属性都会被填充。如果读取失败,则 result 的值为 null ,否则即是读取的结果,绝大多数的程序都会在成功读取文件的时候,抓取这个值。

4,1使用方法

FileReader通过异步的方式读取文件内容,结果均是通过事件回调获取;实例如下:打开文件对话框读取文本文件/图片

 <input type="file" id="file" />
         var input=document.getElementById("file");//判断是否存在FileReader()对象if(window.FileReader){console.log(input.files);}else{console.log("error")}input.onchange=function(){//1,获取文件列表(input:files)var files = input.files;for(var i=0 ; i<files.length;i++){var fileList = files[i];//2,创建FileReader()对象var reader = new FileReader();//3,调用FileReader的方法reader.readAsDataURL(fileList);//4,调用事件,当操作成功/失败后进行操作reader.onload=function(){document.write(this.result)}}}

查看图片输出结果:

查看.txt输出结果:

很明显,readAsDataURL会将文件内容进行base64编码后输出,这个很好区分。进行不同操作可以选择不同的方法,例如打印出文本readAsText(),只需要将第三步修改即可reader.readAsText(fileList,"utf-8"); 中文windows系统 txt 文本多数默认编码 gbk

查看图片输出结果:

.txt输出为:txt里面的内容

readAsText读取文件的单位是字符,故对于文本文件,只要按规定的编码方式读取即可;而对于媒体文件(图片、音频、视频),其内部组成并不是按字符排列,故采用readAsText读取,会产生乱码,同时也不是最理想的读取文件的方式

这是只介绍常用的,其他的自己可以试验一下;说到FileReader就肯定要提到bold。

5,blod对象

一直以来,JS都没有比较好的可以直接处理二进制的方法。而Blob的存在,允许我们可以通过JS直接操作二进制数据。

一个Blob对象就是一个包含有只读原始数据的类文件对象。Blob对象中的数据并不一定得是JavaScript中的原生形式。File接口基于Blob,继承了Blob的功能,并且扩展支持了用户计算机上的本地文件。

Blob对象可以看做是存放二进制数据的容器,此外还可以通过Blob设置二进制数据的MIME类型。这里不做详细解释,等遇见再说,现在只说一些常用的

5.1,URL.createObjectURL()

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。

objectURL = URL.createObjectURL(blob);

使用URL.createObjectURL()函数可以创建一个Blob URL参数blob是用来创建URL的File对象或者Blob对象,返回值格式是:blob://URL。

在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象,即使你已经用相同的对象作为参数创建过。当不再需要这些 URL 对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法传入创建的URL为参数,用来释放它。浏览器会在文档退出的时候自动释放它们,但是为了获得最佳性能和内存使用状况,应该在安全的时机主动释放掉它们。

5.2,URL.revokeObjectURL()

URL.revokeObjectURL() 静态方法用来释放一个之前通过调用 URL.createObjectURL() 创建的已经存在的URL 对象。当你结束使用某个 URL 对象时,应该通过调用这个方法来让浏览器知道不再需要保持这个文件的引用了。

 window.URL.revokeObjectURL(objectURL);

参数: objectURL 是一个通过URL.createObjectURL()方法创建的对象URL.

6,文件拖拽 =》从浏览器外获取数据

6.1,拖拽读取文件信息--使用dataTransfer

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title>从浏览器外拖拽</title><style type="text/css">#content {width: 300px;height: 300px;border: 1px dashed;margin: 20px;}img {width: 300px;height: 300px;}</style></head><body><h3>HTML5拖放API之本地文件拖放</h3><hr /><div id="content">请将文件拖放至此处。</div><div id="demo"></div><script type="text/javascript">//两个变量分别为图片存储位置,和显示的内容var content = document.getElementById("content")var demo = document.getElementById("demo")content.ondragover = function(e) {e.preventDefault();}content.ondrop = function(e) {e.preventDefault();var str = "";this.innerHTML = "";var files = e.dataTransfer.files;for (var i = 0; i < files.length; i++) {var fileList = files[i];var reader = new FileReader();reader.readAsDataURL(fileList);reader.onload = function() {var img = new Image();img.src = this.result;content.appendChild(img)}console.log(fileList);var lastDate = fileList.lastModifiedDate;var lastDateStr = lastDate.toLocaleString(); //2019/8/28 下午10:41:06// console.log(lastDate.toLocaleDateString());//2019/8/28// console.log(lastDate.toLocaleTimeString());//下午10:41:06str += '<li>文件名称:' + fileList.name + '</li><li>文件大小:' + fileList.size + '</li><li>文件类型:' + fileList.type +'</li><li>修改时间:' + lastDateStr + '</li>';// console.log(str);       demo.innerHTML = '<ul>' + str + '</ul>';}}// console.log(fileList)// lastModified: 1567003356162// lastModifiedDate: Wed Aug 28 2019 22: 42: 36 GMT + 0800(中国标准时间) {}// name: "捕获.PNG"// size: 28725// type: "image/png"// webkitRelativePath: ""//等等</script></body>
</html>

6.2拖拽显示图片及信息--使用blob对象

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title>使用blod对象实现拖拽</title><style type="text/css">#content{width:300px;height:350px;border: 1px dashed red;}#output{width:300px;text-align: center;}img{width: 300px;height: 300px;}</style></head><body><h3>拖拽图片进入</h3><div id="content"></div><!-- 放下 文字 --><div id="output"></div><script type="text/javascript">var content =document.getElementById("content");var output =document.getElementById("output");content.ondragover=function(e){e.preventDefault();this.style.overflow="auto"}content.ondrop=function(e){e.preventDefault();var files = e.dataTransfer.files;for(var i=0;i<files.length;i++){var  fileList=files[i];//使用FileReader// var reader=new FileReader();// reader.readAsDataURL(fileList);//使用blodvar imgURL = window.URL.createObjectURL(fileList);var img =new Image();img.src=imgURL;        //src="blob:null/369582d5-883c-4f8a-a8a0-b01b9d654315"this.appendChild(img)// console.log(img)       var lastModifiedDate = fileList.lastModifiedDate;var lastDate=lastModifiedDate.toLocaleString()output.innerHTML="<p>"+fileList.name+"<br>"+fileList.type+"<br>大小:"+fileList.size+"<br>"+lastDate+"<br></p>"}}</script></body>
</html>

javascript基础之拖拽(2)(详细篇)---FileReader对象,blod对象相关推荐

  1. JavaScript实现鼠标拖拽效果

    JavaScript实现鼠标拖拽效果 前几篇博客一直在讲鼠标的移动事件相关的效果,今天再来讲一讲如何利用鼠标事件实现拖拽div块移动的效果.效果如图: HTML代码: <div id=" ...

  2. JavaScript中的拖拽事件且限制出界

    JavaScript中的拖拽事件限制出界 JavaScript事件中很多都会用到拖拽,而在现实中很多拖拽是会限制在浏览器界面禁止出界的,下面是封装好的限制出界的拖拽事件. function drag( ...

  3. Vue的v-for中列表项拖拽排序详细方法

    首先:HTML中,关键点是监听拖拽的三个阶段,即:dragstart/dragover/dragend,注意:要拖拽元素必须加上draggable="true" <ul @d ...

  4. JavaScript实现鼠标拖拽登录框

    拖拽的本质是登录框获得光标的偏移来调整自身的偏移. 拖拽发生时,光标相对盒子的坐标不会变化,相对于页面的坐标却在变化,二者的差值就是盒子需要的. 两个注意点: 1. 赋值给盒子的什么属性 outer. ...

  5. javascript --- 原生的拖拽功能实现

    准备一个方块: <style>.drag{background-color:#aaf;position:absolute;} </style> <div class=&q ...

  6. javascript --- Sortable一个拖拽的接口

    最近项目里面要实现需要实现一个拖拽功能,自己实现很麻烦,就在网上找到了一个封装好的sortable函数,github(https://github.com/SortableJS/Sortable). ...

  7. unity拖拽 到固定位置_Unity3D拖动任意对象GameObject移动到任意地方

    今天不是很忙,研究了一下拖拽GameObject移动到任意位置,沿x轴和z轴移动,其他的也就不说了,上代码:using UnityEngine; using System.Collections; p ...

  8. Electron中实现拖拽文件进div中通过File对象获取文件的路径和内容

    场景 用HTML和CSS和JS构建跨平台桌面应用程序的开源库Electron的介绍以及搭建HelloWorld: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/a ...

  9. JavaScript基础内功系列,这十篇文章里一定有你感兴趣的

    前端基础内功 这里总结了最经典.出镜率最高的一部分前端基础.希望能帮助自己和其他初级.中级前端同学打牢基础更进一步,加油! 前言 喜欢武侠或热衷武侠游戏的小伙伴门肯定了解,门派的弟子们在学习上乘武功大 ...

  10. 【JavaScript]实现动态拖拽小精灵

    系列文章目录 提示:各位友友大家好呀,今天我们使用js实现一个跟随鼠标移动的小的案例吧 文章目录 系列文章目录 前言 一.元素偏移量是什么? 二.使用步骤 1.想方设法:先获取到坐标 2.读入数据 总 ...

最新文章

  1. 看漫画学python pdf下载_用python下载漫画并打包成pdf文件
  2. ServiceStack 项目实例 001 建立项目结构
  3. faig在matlab意思,MATLAB在电力电子和运动控制系统实验教学中的应用
  4. 将你的Apache速度提高十倍的经验分享
  5. kegra:用Keras深度学习知识图
  6. flink搭建集群(一主三从)
  7. 公用表表达式(CTE)WITH:树型查询、更新
  8. 第七章数组答案C语言,c语言复习题及答案第七章数组.docx
  9. starccm中文用户指南_【干货】Salesforce系统管理员认证考试指南
  10. mysql解决编码问题
  11. python实现命令行工具jq的json路径过滤
  12. Chisel Bootcamp安装说明
  13. Mac 右键展示Copy path
  14. 双向链表学生管理系统(0723)
  15. MIPI 系列之 DSI
  16. flexbox布局详解
  17. 解密顺丰:内部360度监控,创始人王卫穿破牛仔裤见PE
  18. 【转】SCI论文写作全攻略
  19. 采用OKR框架如何使组织敏捷
  20. 解释一下什么是servlet?

热门文章

  1. hibernate.Session简介
  2. Mysql 导出导入
  3. oracle --- to_date('2015','yyyy')
  4. php date()
  5. 推荐12个漂亮的CSS3按钮实现方案
  6. 拓端tecdat|Python用GARCH、离散随机波动率模型DSV模拟和估计股票收益时间序列与蒙特卡洛可视化
  7. 拓端tecdat|R语言解释生存分析中危险率和风险率的变化
  8. labelImg 标签bug
  9. CUDA环境变量添加
  10. 序列标注模型结果评估模块seqeval学习使用