所有分类
  • 所有分类
  • 后端开发
HTML5 文件 API 详解:File 对象、FileList 对象与 FileReader 接口

HTML5 文件 API 详解:File 对象、FileList 对象与 FileReader 接口

3.拖拽上传图片预览:2.拖拽放置后,获取到文件对象集合:e.dataTransfer.files总结:结合拖放事件API,DataTransfer对象和文件读取对象FileList等方面的知识,实现简易拖拽上传图片预览效果。

文件对象,这词儿听上去挺牛逼的吧?其实,它就是个放文件资料的小箱子,比如文件名啊、体积啊、种类什么的都能找到。那FileList?简单来说就是堆放众多这种小箱子的大本营。设想一下,你在文件夹里挑了一堆文件,这时候FileList就能帮助你记住这些东西!

其实,这些文件在本质上都是从Blob那衍化来的。Blob这个名字,第一次听到可能会觉得有点儿奇怪?不过别担心,它其实就是负责存储和处理各种类型的二进制数据,比如我们常见的图片、视频等等。而且,Blob还有一个超级实用的功能——slice,它能让你轻松地获取到数据中的任意片段,简直太方便了!

HTML5 文件 API 详解:File 对象、FileList 对象与 FileReader 接口

FileReader:文件的内存之旅

说起FileReader,这就是个牛气冲天的人物!它就是文本进入你笔记本电脑内存的一位导游,专门负责用正确的方法把它们给带上路。当然,在这个路程当中,FileReader还会触发一些关键的点,比如onerror(出故障时)、onprogress(进行中的时候)和onload(顺利完成时)。这些就像是你在路上看到的指示牌,告诉你现在走到哪里了,是不是遇到了什么问题。

特别棒的事就是,当你成功读完资料以后,只需要用e.target.result或者this.result就能轻松得拿到内容了!相当于你到达了目的地,导游直接把地图塞到你手里,告诉你接下来该往哪儿走。

拖放属性:你的文件,你做主

接下来,咱们说说拖放这个功能。它好像给你一种特异功能,能随意把文件拖来拖去。实现这个小技巧,首先得把你想要拖拽的元素的dragable属性设成真的。像img元素和a元素,它们本来就能被拖动。

可不能忘target里的dragover和drop动作要防止默认效果噢~就像是告诉浏览器说“这儿只有我能扔东西!”这样我们的拖拽才会好用~

DataTransfer对象:拖放的小助手

这个叫DataTransfer的家伙,高大上?它是你拖放数据时的得力帮手。它能从外面拖过来的文件里找信息,比如啥种类的文件;而且还能控制每次拖曳显示什么图片!

比如,你能用setData()给行李贴个标签。至于setDragImage(),它能让你挑个图片当拖拽时的小图标,感觉还挺有意思的!

实战演练:拖拽上传图片预览

好好好,理论科普完了,咱们直接上手!比如说,你想搞个拖拽上传图的功能先。那就得把目标元素的四个大事儿弄清楚:ondragstart、ondragover、ondrop和ondragend。这几个里头,特别得留意的就是ondragover和ondrop,别忘了防备它们的默认反应。

搞定之后,你可以用e.dataTransfer.files来找找这个存放文件的地方。然后,顺手就把它们全拿出来,看看每一个文件都是什么类型、多大。只要找到你想要的那种,那就没什么问题!

下一步,我们要用FileReader这个东西来看文件里都有啥。用readAsDataURL(文件对象)这个方法就能搞定,读完之后,onload事件就会发生,这时候你就可以用this.result来拿到读出来的数据。

记得在FileReader那儿加上点儿有意思的算法处理!顺便说下,这样就能做出个基本能用的拖动上传图片预览小程序。

总结与展望

请将图片文件拖拽至此区域!

看完这篇文章,咱们就搞定了文件拖拽和上传的全套流程!从文件对象开始,然后是FileList,再来就是FileReader和DataTransfer。每个环节都很关键哦~希望这些小知识能帮到你们玩转这些高大上的技术!

最后,问你个问题哈:你感觉咱们这个拖拽上传小功能在你那项目里有用不?你在这儿给大家分享下看法呗,还得给个赞和分享!

    $(function() {
      /*思路:
       *1.熟悉文件拖拽 目标元素 的四个事件,注意:ondragover、ondrop事件中阻止默认行为
       *2.拖拽放置后,获取到文件对象集合:e.dataTransfer.files
       *3.循环该集合中的每个文件对象,判断文件类型以及文件大小,是指定类型则进行相应的操作
       *4.读取文件信息对象:new FileReader(),它有读取文件对象为DataUrl等方法:readAsDataURL(文件对象)、读取成功之后触发的事件:onload事件等,this.result为读取到的数据
       *5.在FileReader对象中的几个事件中进行相应的逻辑处理
       *
       */
 
      //必须将jq对象转换为js对象,调用原生方法
      var oDiv = $(".container").get(0);
      var oP = $(".text");
      //进入
      oDiv.ondragenter = function() {
          oP.html('');
        }
        //移动,需要阻止默认行为,否则直接在本页面中显示文件
      oDiv.ondragover = function(e) {
 
          e.preventDefault();
        }
        //离开
      oDiv.onleave = function() {
          oP.html('请将图片文件拖拽至此区域!');
        }
        //拖拽放置,也需要阻止默认行为
      oDiv.ondrop = function(e) {
 
        e.preventDefault();
        //获取拖拽过来的对象,文件对象集合
        var fs = e.dataTransfer.files;
        //若为表单域中的file标签选中的文件,则使用form[表单name].files[0]来获取文件对象集合
        //打印长度
        console.log(fs.length);
        //循环多文件拖拽上传
        for (var i = 0; i < fs.length; i++) {
          //文件类型
          var _type = fs[i].type;
 
          console.log(_type);
          //判断文件类型
          if (_type.indexOf('image') != -1) {
            //文件大小控制
            console.log(fs[i].size);
            //读取文件对象
            var reader = new FileReader();
            //读为DataUrl,无返回值
            reader.readAsDataURL(fs[i]);
            reader.onloadstart = function(e) {
                //开始加载
              }
              // 这个事件在读取进行中定时触发
            reader.onprogress = function(e) {
 
              $("#total").html(e.total);
            }
 
            //当读取成功时触发,this.result为读取的文件数据
            reader.onload = function() {
                //文件数据
                // console.log(this.result);
                //添加文件预览
                var oImg = $("");
                oImg.attr("src", this.result);
                $(oDiv).append(oImg); //oDiv转换为js对象调用方法
              }
              //无论成功与否都会触发
            reader.onloadend = function() {
              if (reader.error) {
                console.log(reader.error);
              } else {
                //上传没有错误,ajax发送文件,上传二进制文件
              }
            }
          } else {
            alert('请上传图片文件!');
          }
        }
 
      }
    });
  

原文链接:https://www.icz.com/technicalinformation/web/2024/06/18558.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?