全面理解html5的file API

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

本文主要解决的问题:

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){

////......

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容