Html5——File、FileReader、Blob、Fromdata对象

www.cnblogs.com/fps2tao/p/9…

转自上面
File
File 接口提供有关文件的信息,并允许网页中的JavaScript访问其内容。
File对象可以用来获取某个文件的信息,还可以用来读取这个文件的内容。通常情况下,File对象是来自用户在一个 <input> 元素上选择文件后返回的FileList对象,也可以是来自由拖放操作生成的 DataTransfer对象。用户在选择一个或者多个文件后,可以通过File API访问这些File对象,这些对象被包含在一个FileList对象中。所有type为file的input都有一个files属性,通过Element.files可以返回FileList对象。复制代码
<body><input type="file" id="fileInput" name="file" multiple="multiple" accept="image/*"><script>var fileInput = document.querySelector("#fileInput");fileInput.addEventListener("change", function (event) {var file = fileInput.files[0];console.log(fileInput.files)}, false)</script>
</body>
复制代码files有一个length属性和item方法,可以通过files[index]或者files.item(index)获取我们选择的file对象。每个File对象中包含了文件的一些详细信息:根据size属性换算为我们习惯的文件大小单位:复制代码
function bytesToSize(bytes) {if (bytes === 0) return '0 B';  var k = 1024,sizes = ['B','KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];// Math.log() 返回数字的自然对数 log(b)/log(a)=loga(b)) 换底公式 log以a为底b的对数// Math.floor(x) -- 向下取整,返回小于或等于x的值// Math.pow(x,y) -- 返回以x的y次幂,等同于x^y的数值表达式var i = Math.floor(Math.log(bytes) / Math.log(k));return (bytes / Math.pow(k, i)).toFixed(1) + ' ' + sizes[i];
}
复制代码FileReader
FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据其中File对象可以是来自用户在一个<input>元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果
DataURI对象
先来看一个例子:复制代码
<body><div id="dropbox" class="dropbox"><div class="area">拖动图片到这里</div></div><div id="preview"></div><script type="text/javascript">var dropbox = document.querySelector("#dropbox");var preview = document.querySelector("#preview");dropbox.addEventListener("dragenter", function (e) {e.stopPropagation();e.preventDefault();}, false);dropbox.addEventListener("dragover", function (e) {e.stopPropagation();e.preventDefault();}, false);dropbox.addEventListener("drop", function (e) {e.stopPropagation();e.preventDefault();var dt = e.dataTransfer;var files = dt.files;for (var i = 0; i < files.length; i++) {var file = files[i];var imageType = new RegExp("^image\/");if (!imageType.test(file.type)) continue;// 填充选择的图片到展示区var img = document.createElement("img");img.classList.add("obj");img.file = file;preview.appendChild(img);// 读取File对象中的内容var reader = new FileReader();reader.onload = (function (aImg) {return function (e) {aImg.src = e.target.result;};})(img);reader.readAsDataURL(file);}}, false);</script>
</body>
复制代码在上面的例子中,预览图片的src使用了”data:image/png;base64,xxxxxxxxxxxxx”这种形式的字符串(base64),这种字符串叫做DataURI对象,允许将一个小文件进行编码后嵌入到另外一个文档里,格式为:data:[<MIME type>][;charset=<charset>][;base64],<encoded data>
这个字符串可以分为三部分,即声明:参数+数据,逗号左边的是各种参数,右边的是数据。我们可以通过FileReader 的readAsDataURL方法获得文件的DataURIreadAsDataURL()
开始读取指定的Blob对象或File对象中的内容。当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之。同时,result属性中将包含一个data:URL格式的字符串以表示所读取文件的内容。
var reader = new FileReader();
reader.onload = function() {console.log(this.result);
}
reader.readAsDataURL(file);URL对象除了可以使用base64字符串作为内容的DataURI将一个文件嵌入到另外一个文档里,还可以使用URL对象。URL对象用于生成指向File对象或Blob对象的URL
静态方法:
URL.createObjectURL() 该方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。objectURL = URL.createObjectURL(blob);
blob 是用来创建 URL 的 File 对象或者 Blob 对象​URL.revokeObjectURL() 
该方法用来释放一个之前通过调用 URL.createObjectURL() 创建的已经存在的 URL 对象。当你结束使用某个 URL 对象时,应该通过调用这个方法来让浏览器知道不再需要保持这个文件的引用了。window.URL.revokeObjectURL(objectURL);
objectURL 是一个 DOMString,表示通过调用 URL.createObjectURL() 方法产生的 URL 对象同样以拖拽上传图片预览为例子:复制代码
<body><div id="dropbox" class="dropbox"><div class="area">拖动图片到这里</div></div><div id="preview"></div><script type="text/javascript">var dropbox = document.querySelector("#dropbox");var preview = document.querySelector("#preview");dropbox.addEventListener("dragenter", function (e) {e.stopPropagation();e.preventDefault();}, false);dropbox.addEventListener("dragover", function (e) {e.stopPropagation();e.preventDefault();}, false);dropbox.addEventListener("drop", function (e) {e.stopPropagation();e.preventDefault();console.log(e)var dt = e.dataTransfer;var files = dt.files;for (var i = 0; i < files.length; i++) {var file = files[i];var imageType = new RegExp("^image\/");if (!imageType.test(file.type)) {console.log(1)continue;}// 填充选择的图片到展示区var img = document.createElement("img");img.classList.add("obj");img.file = file;img.src = window.URL.createObjectURL(file);preview.appendChild(img);}}, false);</script>
</body>
复制代码Blob 二进制大对象
什么是Blob对象?
实际上上文的File对象只是 Blob 对象的一个更具体的版本,Blob对象 存储着大量的二进制数据,并且 Blob 的 size 和 type 属性,都会被 File 对象所继承。同样FileReader对象也可以从Blob对象中读取数据。一个 Blob对象表示一个不可变的, 原始数据的类似文件对象。Blob表示的数据不一定是一个JavaScript原生格式。 File 接口基于Blob,继承 blob功能并将其扩展为支持用户系统上的文件。
使用 Blob() 构造函数可以构造一个Blob从其他非blob对象和数据。要创建一个包含另一个blob的数据子集的blob,使用 slice() 方法。Blob 构造函数生成blob对象
Blob构造函数,接受两个参数。第一个参数是一个包含实际数据的数组,第二个参数是数据的类型,这两个参数都不是必需的。数组元素可以是任意多个的ArrayBuffer,ArrayBufferView (typed array), Blob,或者 DOMString对象。例如:var arr = ['<h1>hello world</h1>'];
var blob = new Blob(arr, { "type" : "text/xml" }); // the blob
console.log(blob);
slice方法生成blob对象
Blob对象的slice方法,将二进制数据按照字节分块,返回一个新的Blob对象var newBlob = oldBlob.slice(startingByte, endindByte);
返回一个新的 Blob 对象,包含了源 Blob 对象中指定范围内的数据。使用XMLHttpRequest对象,将大文件分割上传:复制代码
function upload(blobOrFile) {var xhr = new XMLHttpRequest();xhr.open('POST', '/server', true);xhr.onload = function(e) { ... };xhr.send(blobOrFile);
}document.querySelector('input[type="file"]').addEventListener('change', function(e) {var blob = this.files[0];const BYTES_PER_CHUNK = 1024 * 1024; // 1MB chunk sizes.const SIZE = blob.size;var start = 0;var end = BYTES_PER_CHUNK;while(start < SIZE) {upload(blob.slice(start, end));start = end;end = start + BYTES_PER_CHUNK;}
}, false);
复制代码
DataURI(base64)对象转blob对象(二进制)
复制代码
/*** dataURL to blob, ref to https://gist.github.com/fupslot/5015897* @param dataURI* @returns {Blob}*/
function dataURItoBlob(dataURI) {var byteString = atob(dataURI.split(',')[1]);var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];var ab = new ArrayBuffer(byteString.length);var ia = new Uint8Array(ab);for (var i = 0; i < byteString.length; i++) {ia[i] = byteString.charCodeAt(i);}return new Blob([ab], {type: mimeString});
}
// atob() 将base64解码
// btoa() 将字符串转码为base64
var str = 'javascript';
window.btoa(str)
//转码结果 "amF2YXNjcmlwdA=="
window.atob("amF2YXNjcmlwdA==")
//解码结果 "javascript"
复制代码
FormData
用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个”表单”.比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件
FormData对象的作用类似于jQuery里面的 serialize() 方法,serialize() 作用就是表单序列化,也就是以查询字符串形式获得类表单post/get的数据给Ajax请求,例如:userid=123&username=zxx。使用
new FormData (form? : HTMLFormElement)
form 参数可选,是一个HTML表单元素,可以包含任何形式的表单控件,包括文件输入框。方法
append() 给当前FormData对象添加一个键/值对void append(DOMString 键, Blob 值, [可选] DOMString 文件名);
void append(DOMString 键, DOMString 值);
name 字段名称
value 字段值,可以是Blob value,或者一个字符串,如果全都不是,则该值会被自动转换成字符串
使用FromData对象上传文件
通过HTML表单创建FormData对象提交上传(base64)
<form id="uploadForm" enctype="multipart/form-data"><input id="file" type="file" name="file"/><button id="upload" type="button">upload</button>
</form>
复制代码
$.ajax({url: '/upload',type: 'POST',cache: false,data: new FormData($('#uploadForm')[0]),processData: false,contentType: false
}).done(function(res) {
}).fail(function(res) {});
复制代码
构造 FormData 填充二进制文件数据,通过 ajax 的方式进行提交:
复制代码
var fd = new FormData(); // 构造FromData对象
var blob = dataURItoBlob(dataURI); // 将base64转为二进制blob对象
fd.append('file', blob);
$.ajax({type: 'POST',url: '/upload',data: fd,processData: false, // 不会将 data 参数序列化字符串,必须falsecontentType: false, // 根据表单 input 提交的数据使用其默认的 contentType,必须falsexhr: function() {var xhr = new window.XMLHttpRequest();xhr.upload.addEventListener("progress", function(evt) {if (evt.lengthComputable) {var percentComplete = evt.loaded / evt.total;console.log('进度', percentComplete);}}, false);return xhr;}
}).success(function (res) {// 拿到提交的结果
}).error(function (err) {console.error(err);
});复制代码

转载于:https://juejin.im/post/5d4148986fb9a06acc00623b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中小企业信息化及市场

中小企业信息化及市场中小企业信息化是被各界高度关注的领域&#xff0c;近日在中国信息产业经济年会上听到了中小企业司刘怡的报告。中小企业信息化的现状是&#xff1a;61&#xff05;的中小企业已有专职的信息化建设与运行部门&#xff0c;但配置的IT专业技术人员少。可熟练…

linux 修改ldap密码,Linux-ldap密码修改程序,如何加密ssha

LDAP中SHA,SSHA,MD5加密方法经过了特殊处理SHA加密方法&#xff1a;/*** SHA加密* param $password 需要加密的字符串* return 返回加密号的字符串* */public function ldap_sha($password){$ldap_passwd "{SHA}".base64_encode(pack("H*", sha1($passwor…

tinyxml c语言,开源TinyXML 最简单的新手教程

TinyXML它是基于一个非常受欢迎的现在DOM型号XML解析器&#xff0c;简单易用且小巧玲珑&#xff0c;很适合存储简单数据。配置文件。当前最新版本号是2.6.2先看一下源代码文档的结构&#xff1a;Docs是帮助文档。里边有许多的使用说明&#xff0c;只截一张图看一下&#xff1a;…

c语言程序设计教程本科,新编C语言程序设计教程(本科)第5篇.pdf

第5章选择结构程序设计第5章选择结构程序设计5.1 if语句5.2 switch语句5.3 goto语句5.4 程序设计举例第5章选择结构程序设计5.1 if语句5.1.1 单分支if语句格式: if (条件表达式)语句功能: 先计算条件表达式的值, 如果条件表达式的值为真(非0 ), 执行语句(选择体), 否则执行if语…

真的要去美国吗?

[url]http://finance.sina.com.cn[/url] 2006年07月12日 16:39 《市场圈》虽然这两年“海龟”和“海带”的话题已经不再成为媒体关心的焦点&#xff0c;但是关于MBA的讨论似乎更加白热化。我曾经也认真地问过自己,“真的值吗&#xff1f;”文&#xff5c;寨克1999年8月26日&…

C#开发高亮语法编辑器(一)——TextBox ,RichTextBox

C#简单实现高亮语法编辑器(一)——TextBox ,RichTextBox的局限性一、RichTextBox基本设置二、实现语法高亮三、关键字提示四、实现行号就简单快速得开发文本编辑器TextBox 最为简单&#xff0c;大家用得也多&#xff0c;缺点是无法实现复杂的操作。RichTextBox虽然是则功能比它…

c语言即时通讯软件源码,即时通讯软件源码-基于c语言即时通讯软件代码实现

我不知道哪种语言无关紧要。开源&#xff0c;我不知道该用什么。即时通讯软件源代码为JAVA语言对于即时通讯软件源代码最好是用C语言编写的&#xff0c;想学一下&#xff0c;感谢您即时通讯软件有什么。includewinscock2、h#includewinscock2、h#includesting。h#includewindow…

介绍一款资料管理软件EverNote

原来一直用OneNote来做资料收集。资料收集软件很重要的一点就是需要的时候要能很容易地找到所需资料。OneNote是通过[笔记本]>[工作区]>[页]的严格层次结构来管理资料&#xff0c;有个假定就是资料是可以纳入一个树状系统并且各个节点之间没有交叉。但这个明显是有问题的…

蒙特卡洛法求圆周率 c语言,c++蒙特卡洛法求圆周率

在linux下用 g pi.cpp -o pi -lm 编译。//蒙特卡洛法求圆周率#include #include #include #include using namespace std;double FindPi(const long n){srand(time(NULL));long sum 0;double x 0.0, y 0.0;for (long i 0; i < n; i){x (double)(rand())/(double)RAND_M…

Dvbbs 7.1论坛鼠标指针修改方法

http://www.jfeng.cn/1.请登陆后台,进入风格界面设置里 - 当前模板CSS设置(Forum_CSS)2.在BODY{.........}里面加入: CURSOR: url(skins/xx.ani)3.完成.

android 引用非 android 工程,Unity3D调用android方法(非插件方式)

关于Unity3D工程与android工程的转换与合并&#xff0c;请参考我的另外一篇博客&#xff0c;如果你对Unity3D工程加入到android工程的过程不熟悉&#xff0c;也请先看完下面这篇博客&#xff1a; android与Unity3D交互&#xff0c;fragment显示unity3d视图。 下面&#xff0c;我…

探讨继承与实现(二)

前文 探讨继承与实现&#xff08;一&#xff09; 根据双鱼座的提示已经更新。很不巧&#xff0c;我也是双鱼座的。由于水平有限&#xff0c;有什么不足还请大家指教。2007年2月1日 http://www.cnblogs.com/birdshover/目录&#xff1a;一、抽象的产生二、依赖抽象三、抽象的损…

实现android应用程序自动化测试的批处理脚本,简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本...

一、前言好久没写帖子&#xff0c;去年晋升为 leader 之后工作比较忙&#xff0c;去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试&#xff0c;到今天为止跑了将近半年&#xff0c;前期感觉还行&#xff0c;但随着用例的增加&#xff0c;执行自动化脚本的时间…

祝大家新年快乐

祝大家新年快乐!万事如意!衷心祝愿大家在新的一年里&#xff1a;所有的期待都能出现&#xff01; 所有的梦想都能实现!所有的希望都能如愿!所有的努力都能成功! 感谢大家一直以来对博客园的支持与帮助!转载于:https://www.cnblogs.com/dudu/archive/2007/02/17/652131.html

android 重新启动应用程序,在AsyncTask完成后重新启动完整的Android应用程序

我编码的应用程序检查/ sdcard下的目录中是否有特殊的ZIP文件,如果没有,则开始下载并解压缩.即使是子目录,下载和解压缩也可以工作.但是我需要在完成后重新启动应用程序 – 这不起作用.起初我有一个特殊的活动“PreMainActivity.java”只是为了重新启动目的&#xff1a;import …

Castle学习之一:安装与环境设置

第一步&#xff0c;当然是下载了。我本来下载的是Castle RC2的MSI安装文件&#xff0c;并通过SVN下载了Generator&#xff0c;但是安装后发现了一些问题&#xff08;主要是.net版本的问题&#xff09;&#xff0c;所以删除了之后&#xff0c;从SVN下载了全部最新的代码&#xf…

android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

前言想在锁屏上面实现弹窗&#xff0c;第一个想法就是利用 WindowManager设置 Window的 Flag&#xff0c;通过设置 Flag的显示优先级来让窗口显示在锁屏的上面。接下来就是试验可能相关的 Window Type属性&#xff0c;验证该方案是否可行。在尝试各个 Window Type 属性之前需要…

C# 调用 *.sql 文件

源&#xff1a;http://zhidao.baidu.com/question/5367984.html?si2using System; using System.Xml; using System.Data; using System.IO; using System.Collections; using System.Data.SqlClient; namespace ExecuteSqlFile { /// <summary> /// DBAccess 的摘要说明…

next按钮源码android,Android Edittext 软键盘输入法回车键改成下一步Next

软件盘中回车键默认功能是换行&#xff0c;但是有时候我们在Edittext中输完内容后点回车想要把焦点切到下一个Edittext继续输入&#xff0c;比如常见的登录页面&#xff0c;在输完用户名后&#xff0c;点回车调到输入密码输入框继续输入。示例代码代码很简单&#xff0c;如下所…

获取周的日期范围

/*** 获取周的日期范围* param string $week* param string $year* return array*/ public static function getWeekDate($week ,$year ) {/*** 2007年 第一周 是 01-01 到 01 - 07 因为第一天就是星期一 6* 2008年 第一周 是 01-01 到 01 - 06 因为第一天就是星期二 5 (闰年…