最近用vue做的项目中有用到一个图片上传,实时预览的功能;其中我用到了两个HTML5的新特性:FileReaderFormData

首先介绍下这两个方法:

HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取文件结果的各类事件模型,想查看详细描述,请阅读FileReader。

1.检测浏览器对FileReader兼容性的方法:

if(window.FileReader) {  var fr = new FileReader();  // add your code here
}
else {  alert("Not supported by your browser!");
}
/*方法二:检测FileReader类型*/
if(typeof FileReader==='undefined'){alert('您的浏览器不支持图片上传,请升级您的浏览器');return false;}

2.调用fileReader对象的方法
FileReader实例拥有四个方法,其中三个是用来读取文件,另一个是用来中断读取的。需要注意的是,无论读取成功或是失败,方法并不会返回读取结果,这一结果(储存在result属性中)要用FileReader处理事件去获取;

方法名 参数 描述
abort none 中断读取
readAsBinaryString file 将文件转化为二进制码
readAsDataURL file 将文件读取为DataURL
readAsText file,[encoding] 将文件读取为文本

readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
readAsBinaryString:该方法将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。
readAsDataURL:这是例子程序中用到的方法,该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URL,Data URL是一种将小文件直接嵌入文档的方案。这里的小文件通常是指图像与 html 等格式的文件。

3.处理事件
FileReader 包含了一整套完成的事件模型,用于捕获读取文件时的状态,下面这个表格归纳了这些事件。

事件 描述
onabort 中断时触发
onerror 出错时触发
onload 文件读取成功完成时触发
onloadend 读取完成时触发,无论读取成功或失败
onloadstart 读取开始时触发
onprogress 读取中

XMLHttpRequest Level 2添加了一个新的接口 - - - FormData 对象,我们可以通过 javascript 用一些键值对来模拟表单提交,我们还可以用XMLHttpRequest 的 send() 方法来异步的提交表单。与普通的 Ajax 相比,使用 FormData 的最大优点就是我们可以异步上传二进制文件。

创建一个FormData 对象

你可以创建一个空的FormData对象,然后使用append()方法想该对象添加字段,如下:

var oMyForm = new FormData();oMyForm.append("username", "Groucho");
oMyForm.append("accountnum", 123456); // 数字123456被立即转换成字符串"123456"// fileInputElement中已经包含了用户所选择的文件
oMyForm.append("userfile", fileInputElement.files[0]);var oFileBody = "<a id="a"><b id="b">hey!</b></a>"; // Blob对象包含的文件内容
var oBlob = new Blob([oFileBody], { type: "text/xml"});oMyForm.append("webmasterfile", oBlob);var oReq = new XMLHttpRequest();
oReq.open("POST", "http://foo.com/submitform.php");
oReq.send(oMyForm);

注:字段 “userfile” 和 “webmasterfile” 的值都包含了一个文件。通过 FormData.append() 方法赋给字段 “accountnum” 的数字被自动转换为字符(字段的值可以是一个 Blob 对象,File对象或者字符串,剩下其他类型的值都会被自动转换成字符串)。
在该例子中,我们创建了一个名为 oMyForm 的 FormData 对象,该对象中包含了名为”username”,”accountnum”,”userfile” 以及 “webmasterfile” 的字段名,然后使用XMLHttpRequest的 send() 方法把这些数据发送了出去。”webmasterfile” 字段的值不是一个字符串,还是一个 Blob 对象。

使用form表单初始化一个FormData对象

可以用一个已有的 form 元素来初始化 FormData 对象,只需要把这个 form 元素作为参数传入 FormData 构造函数即可:

var formElement = document.getElementById("myFormElement");
var oReq = new XMLHttpRequest();
oReq.open("POST", "submitform.php");
oReq.send(new FormData(formElement));

浏览器兼容性

Feature Chrome Firefox(Gecko) IE Opera Safari
Basic support 7+ 4.0(2.0) 10+ 12+ 5+
支持filename参数 (yes) 22.0(22.0) ? ? ?

下面是我的项目代码:

<div class="issue-project-main clearfix" id='issue_project_main'>
<form  v-on:submit.prevent="submit_issue_project()" id="project_form"><div class="issue-project-left"><div v-if="images.length >0"><ul><li v-for="(image,key) in images" style="position:relative;"><img :src="data:image" @click='delImage(key)' class="image-upload"/><a href="#" class="remove-box" @click='delImage(key)'><span class="image-remove"></span></a></li></ul><!-- <button @click="removeImage">移除全部图片</button> --><!-- <button @click='uploadImage' >上传</button> --></div> <div v-show="showbutton"><a id='addPic' href="" v-on:click="addPic">上传项目图片 </a><input type="file" id="imagebox" v-on:change="getImage()"     @change="onFileChange" name="image" style="display: none;"></div></div><div class="issue-project-form-list issue-project-form-btn"><p class='errormsg' v-text='errormsg'></p><div class="mask-submit" v-if='disabled'></div><input type="submit" class="issue-project-btn" value="完成"/><input type="button" class="cancel-project-btn" value="取消" @click='back' /></div></div></form></div>

js代码:

 var issue_project = new Vue({el:'#issue_project_main',data:{showbutton:true,disabled:false,url_ajax:'',images: []//显示的图片},watch:{images:function(){if(this.images.length >0){this.showbutton = false}else{this.showbutton = true}}},methods: {/*以下是上传图片的js*/getImage:function(){file = $("#imagebox")[0].value},addPic:function(e){e.preventDefault();$('input[type=file]').trigger('click');return false;},onFileChange:function(e) {var files = e.target.files || e.dataTransfer.files;if (!files.length)return; this.createImage(files);},createImage:function(file) {if(typeof FileReader==='undefined'){alert('您的浏览器不支持图片上传,请升级您的浏览器');return false;}var image = new Image();         var vm = this;var leng=file.length;for(var i=0;i<leng;i++){var reader = new FileReader();reader.readAsDataURL(file[i]); reader.onload =function(e){vm.images.push(e.target.result);                                    };                 }                        },delImage:function(index){this.images.shift(index);},removeImage: function(e) {this.images = [];},/*以上是上传图片的js*/submit_issue_project:function(){var _this = this;_this.url_ajax = '/vdg/api/project/create'if(edit){_this.url_ajax = '/vdg/api/project/update'}var formElement = document.getElementById("project_form");var formData = new FormData(formElement);axios({method: 'post',url: _this.url_ajax,data: formData,headers: {'Content-Type': 'multipart/form-data'},}).then(function(res){console.log(res);}).catch(function(error) {console.log(error);});}},})

HTML5新特性:FileReader 和 FormData相关推荐

  1. 百度开发者大会-《用HTML5新特性开发移动App》PPT分享

    今天百度开发者大会,移动互联网分论坛,我的主题演讲<用HTML5新特性开发移动App>PPT分享如下. 完整PPT可在Slideshare观看,或者在百度开放云平台上下载到.

  2. html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题

    html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题 参考文章: (1)html5新特性:利用history的pushState等方法来解决使用aj ...

  3. HTML中三维特性,前端进阶系列(三):HTML5新特性

    HTML5 是对 HTML 标准的第五次修订.其主要的目标是将互联网语义化,以便更好地被人类和机器阅读,并同时提供更好地支持各种媒体的嵌入.HTML5 的语法是向后兼容的.现在国内普遍说的 H5 是包 ...

  4. 【阿里云大学课程】前端必知——HTML5新特性完整视频教程(音频、视频、画布、web存储、动画……)...

    HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定,其设计目的是为了在移动设备上支持多媒体. 本课程中,你将学习到下列这些HTML5新特性(点击下列课时立即学习): ...

  5. html5 logo svg,HTML5新特性之用SVG绘制微信logo

    html5新特新html5 中的一些有趣的新特性:1.用于绘画的 canvas 元素 2.用于媒介回放的 video 和 audio 元素 3.对本地离线存储的更好的支持 4.新的特殊内容元素,比如 ...

  6. html5储存类型特点,避免踩雷!你不得不知的 HTML5 “新”特性

    什么是 HTML5 HTML的发展历程如下: 产生于1990年 1997年 HTML4 出现,成为互联网开发的标准 2008年,HTML5正式出现,2002年趋于稳定 HTML在发展过程中,HTML4 ...

  7. html做微信logo,HTML5新特性之用SVG绘制微信logo

    原标题:HTML5新特性之用SVG绘制微信logo 这篇文章主要介绍了HTML5新特性之用SVG绘制的微信logo的相关资料,需要的朋友可以参考下. HTML5新特新 HTML5中的一些有趣的新特性: ...

  8. 利用HTML5新特性实现拖拽交换表格单元格元素

    利用HTML5新特性实现拖拽交换表格单元格元素 HTML5新特性:拖放 拖放 拖放(Drag 和 Drop)是很常见的特性.它指的是您抓取某物并拖入不同的位置. 拖放是 HTML5 标准的组成部分:任 ...

  9. html5 svg特性,HTML5新特性——HTML 5 Canvas vs. SVG

    Canvas 和 SVG 都允许您在浏览器中创建图形,但是它们在根本上是不同的. SVG SVG 是一种使用 XML 描述 2D 图形的语言. SVG 基于 XML,这意味着 SVG DOM 中的每个 ...

  10. 【HTML5新特性】

    HTML5新特性 一.语义标签 二.增强型表单 1. input特性 2. 五个表单元素 3. 表单属性 三.音频和视频 四.canvas 五.SVG 六.地理位置 七.拖放API 八.web Wor ...

最新文章

  1. NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用
  2. 也谈SSDT Hook(二)
  3. R沟通|Bookdown中文书稿写作手册(中)
  4. python gui界面实例_Python界面(GUI)编程PyQt5工具栏和菜单
  5. 360度全面抵御黑客攻击的新型芯片来了!
  6. 深度解析国内主流离线编程软件
  7. php 判断 小米 手机浏览器,javascript - uc、qq、搜狗 以上三个手机浏览器判断移动端的js代码不执行...
  8. listview 分页加载
  9. tbase 之一 github setup
  10. (1)初探android——客户端开发学习
  11. Gradient Normalization在多任务学习中的优化实践
  12. CC控制服务的设计和侦测方法综述
  13. 电脑录屏软件帧率设置详解
  14. 学习linux能做什么?
  15. Ubuntu18.04无法连接Wifi解决方案
  16. python爬取股票信息_利用Python爬取网易上证所有股票数据(代码
  17. 英伟达 TX2 蓝牙自动连接蓝牙 设备
  18. tcp发送窗口(滑动窗口)、拥塞窗口
  19. mysql 修改 root 密码
  20. android os感染病毒,安卓系统能感染win系统病毒吗?

热门文章

  1. 44 转载arcgis api for js 4.x 叠加自定义图片
  2. 【王道思维扩展1】求解斐波那契数列的递归和非递归算法,并分析两种时间复杂度
  3. RV1126笔记十四:吸烟行为检测及部署<一>
  4. 【死磕 Spring】—– 死磕 Spring 精品合集
  5. mysql item.pop_python flas中mysql的popluate组合框值
  6. MCS-51汇编语言程序设计
  7. 正确区分无线路由WDS和桥接功能
  8. ZigBee-CC2530学习心得(1) --------ZigBee开发工具
  9. JCP:JSR 269 Pluggable Annotation Processing API
  10. Umeng推送消息的坑,Android Service的android:exported详解