美文网首页
全面理解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

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