美文网首页
全面理解html5的file API

全面理解html5的file API

作者: 学不可以已 | 来源:发表于2017-04-06 23:04 被阅读0次

在项目中经常遇到需要将本地图片上传至服务端的情况,免不了要本地预览选择的图片,图片太大的情况下还需要对图片进行一番压缩,通过最近做的项目,对这几种图片处理情况做一个总结。

本文主要解决的问题:

1.图片在线预览功能

2.图片压缩

3.通过formData 对象上传图片

图片在线预览功能:

需要了解的内容:

FileReader 对象

html5为读取上传文件的数据所提供的对象,它包含以下几个方法:

readAsBinaryString(Blob/file):把文件内容以二进制的方式读取,并放在FileReader的result属性中,它接受Blob对象或者文件对象。

readAsText(Blob/file, "utf-8"):把文件内容以文本字符串的方式读取,并放在FileReader的result属性中,它接受Blob对象或者文件对象。(可以为它指定编码格式)

readAsDataURL(Blob/file) :把文件内容以DataURL的方式读取,并放在FileReader的result属性中,它接受Blob对象或者文件对象。

什么是Blob对象?

Blob对象就是选择文件的原始数据类型,它提供slice方法可以读取原始数据中某一块数据,如果上次文件较大,可以利用Blob可切割的特性将文件分批次上传。

我们的主要思路是将选择的图片文件转换成DataURL的形式,再把dataURL赋给img标签的src属性即可,因此我们的第一种方法是利用FileReader 的readAsDataURL方法,转换为我们想要的数据格式。

首先,在html里创建一个选取文件的元素:

再创建一个在线预览的按钮和显示区域:

js中的操作(readAsDataURL的方式):

varreadAsDataURL=document.querySelector("#readAsDataURL");

varimg=document.querySelector("#img");

readAsDataURL.addEventListener("click",function(){

////获得文件

varfiles=document.querySelector("#upload").files;

if(files.length>0){

////创建FileReader对象

varreader=newFileReader();

////将文件以dataURL读取, 把文件放在了reader.result上

reader.readAsDataURL(files[0]);

////读取完毕,执行后续操作

reader.onload=function(){

img.setAttribute("src",this.result);

}

}

});

除此之外,还可以利用window.URL中的createObjectURL方法,该方法可以生成一个url对象,不仅能实现预览功能还可以对文件进行下载。

varcreateObjectURL=document.querySelector("#createObjectURL");

varimg=document.querySelector("#img");

createObjectURL.addEventListener("click",function(){

varfiles=document.querySelector("#upload").files;

if(files.length){

varurl=window.URL.createObjectURL(files[0]);

////可实现图片预览功能

img.setAttribute("src",url);

}

});

下载创建a标签:

vara=document.createElement("a");

a.href=url;

a.download="usual";

a.innerHTML="下载";

////添加到body

document.body.appendChild(a);

图片压缩:

思路:

1.读取图片 readAsDataURL

2.创建image对象,获取图片的原始尺寸大小

3.创建canvas,把图片付给canvas,绘制,设置绘制的大小这就相当于压缩canvas.drawImage(img, 0, 0, height, width)

4.把canvas又转成dataURL的形式。压缩完成

首先以readAsDataURL的方式读取文件,创建image对象,以便获取图片的原始尺寸大小:

uglify.addEventListener("click",function(){

varfiles=document.querySelector("#upload").files;

varimg=newImage(),single=true;

vartype="";

if(files.length){

varfileReader=newFileReader();

type=files[0].type;

fileReader.readAsDataURL(files[0]);

fileReader.onload=function(){

img.src=this.result;

};

}

});

result赋给img的src后,监听img是否加载完成,进行下一步操作:

img.onload=function(){

////因为后面会再次修改img的src属性,为了避免死循环

if(!single){

return;

}

////获取原始图片的宽度和高度

varsheight=img.height;

varswidth=img.width;

////创建canvas

varcanvas=document.createElement("canvas");

varcvs=canvas.getContext("2d");

////缩小图片的尺寸,等同于压缩

canvas.height=sheight*0.6;

canvas.width=swidth*0.35;

////在画布上得到压缩的图片

cvs.drawImage(img,0,0,sheight/2,swidth/2);

////type是原图片的类型

varresultData=canvas.toDataURL(type);

single=false;

img.src=resultData;

document.body.appendChild(img);

};

图片上传:

利用formData对象可以使用一系列的键值对来模拟一个完整的表单文件,然后用ajax发送这个表单。

//创建formData对象:

vardata=newFormData();

//添加参数,通过append

varfiles=document.querySelector("#upload").files;

data.append("file",files[0]);

//通过ajax 发送

varxml=newXMLHttpRequest();

xml.open("post","url");

xml.send(data);

xml.onreadystatechange=function(value){

if(xml.readyState==4){

////......

}

}

相关文章

  • 全面理解html5的file API

    在项目中经常遇到需要将本地图片上传至服务端的情况,免不了要本地预览选择的图片,图片太大的情况下还需要对图片进行一番...

  • 2019-10-20

    HTML5 File API 在 HTML5 的 input 标签中,新增了一个 type=file 属性的表单控...

  • 利用file和canvas实现图片压缩上传

    利用的技术 HTML5 的 file API 和 canvas 的 drawImage API。 图片上传压缩的意...

  • 浅谈 HTML5 文件处理

    HTML5 文件 API FileList 对象与 file 对象 FileList 对象:表示用户选择的文件列表...

  • html5 file api

    详见:http://www.cnblogs.com/zichi/p/html5-file-api.html

  • HTML5 File API

    原生控件 我是一个萌萌的原生上传控件 文件信息 file存储着上传文件的信息值得一提的是,重复上传文件并不会使Fi...

  • H5直播系列一 Blob File FileReader URL

    参考[HTML5] Blob对象理解DOMString、Document、FormData、Blob、File、A...

  • readAsBinaryString 兼容IE11

    IE不支持html5 file api中readAsBinaryString,貌似还是ie10可以,ieEdge可...

  • H5 FILE API

    simplify the life HTML5 File API — 让前端操作文件变的可能 前言 在 HTML5...

  • [HTML] 获取上传文件大小

    HTML5的File API规范,使我们可以用JS获取上传文件的大小,单位byte。兼容性:http://cani...

网友评论

      本文标题:全面理解html5的file API

      本文链接:https://www.haomeiwen.com/subject/awymgttx.html