通过HTML5实现多文件上传以及本地预览

在HTML5之前,通过<input type="file">一次只能上传一个文件,大部分多文件上传都是通过flash实现得(听说得,我没用过),但是有了HTML5,多文件上传变得非常简单,并且可以本地预览。之前写过一个模仿QQ风格的移动端表单,支持多文件上传(图片),并且可以本地预览。已放在GitHub[感兴趣的点这里],没有维护,对它的外观不要介意。

多文件上传

说了这么多,多文件上传要怎么实现呢?

<input type="file“ multiple  >

只要加了multiple 属性,该input就支持多文件上传了,但是我们要怎么拿到上传的文件呢?
HTML5提供了相应的FileList对象,file对象有相应的属性,如name 、type、lastModifiedDate. 看个代码就明白了

<input type="file" id="upload" multiple >
<script>
    var Upload=document.getElementById("upload");
    var formData=new FormData(); //通过FormData对象可以组装一组用 [XMLHttpRequest]发送请求的键/值对,它可以更灵活方便的发送表单数据。
    Upload.onchange=function(){  //onchange在你选择完文件时触发
          var fileList=Upload.files ; //通过input的files属性获得fileList
          for(let i=0;i<fileList.length;i++)
          {  

                 var file=fileList[i];
                 //比如在这里可以检查文件类型是不是图片
                 if(!/image\/w+/.test(file.type))
                 {
                           alert("请上传图片文件!”);
                           return ;
                 }
                 formData.append("file"+i,file);  //key:"file"+i,value:file,然后就可以把formData post到后台了
                 console.log(file.name+file.lastModifiedDate);
          }
    }
</script>

效果如图

image.png

但是要注意,多文件上传是指你可以一次性添加多个文件,但是如果你添加了一个文件后,再次打开添加,之前的就被清空了,如果场景需要多次添加,可以每次把相关信息自己记下来,然后自己提示用户已添加的文件。(看到这里,可能有的人说既然这样,HTML5多文件上传有什么意义,我本来就可以这样一个个记下来再上传,但是这个用户体验很不好,试想你微信发朋友圈,添加九张图片,一次性添加好,还是一张张加好呢?或者你添加了几个文件后,已经关了,但是突然发现漏掉一个文件,你不总能再把之前的重新再上传一遍吧,所以每上传一个文件,把它记下来是很有必要的)而且时候我们不一定添加的都是同类型文件,所以一次性添加多个文件不是很方便。

本地预览,以图片为例

本地预览主要依赖FileReader对象,FileReader对象用于把文件读入内存
FileReader 对象的方法和事件

Method

  • readAsBinaryString(file对象或者blob对象) 将文件读取为二进制
  • readAsText(file对象或者blob对象) 将文件读取为文本数据
  • readAsDataURL(file对象或者blob对象) 将文件读取为DataURL
  • readAsArrayBuffer(file对象或者blob对象) 将文件读取ArrayBuffer
  • abort 中止读取

Event

  • onabort 数据读取中断时触发

  • onerror 数据读取出错是触发

  • onloadstart 数据读取开始时触发

  • onprogress 数据读取中

  • onload 数据读取成功完成时触发

  • onloadend 数据读取完成时触发,不论成功或失败
    图像预览示例

    <input type="file" accept="image/*" id="upload">
    <div id="preview"></div>
    <script>
        var oPreview=document.getElementById("preview");
        var oUpload=document.getElementById("upload");
        oUpload.onchange=function(){
              var imageFile=oUpload.files[0];
              var reader=new FileReader();
              reader.readAsDataURL(imageFile);
              reader.onload=function(e){
                       oPreview.innerHTML="![]("+this.result+")"; //this.result就是URL
              }
        }  
    </script>
    

    上面的例子是本地预览图片,在网页上通过img标签展示出来,同时也可以预览文本文件等。但是本地预览的应用不仅仅如此,你可以在文件上传到后台之前,对它做任何操作,一个常见的场景就是压缩图片,手机拍的照片通常都在2M以上,我们往往需要提前压缩再给后台,这样可以大大节省带宽。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 HTML5 终于为我们提供了一种通过 File API 规范与本地文件交互的标准方式。为了举例说明其功能,可...
    ddai_Q阅读 2,860评论 1 5
  • 在javascript的世界里无法处理二进制数据,如果需要处理,只能使用charCodeAt()方法,一个个字节地...
    我是上帝可爱多阅读 628评论 0 4
  • 前言 HTML5 中提供的文件API在前端中有着丰富的应用,上传、下载、读取内容等在日常的交互中很常见。而且在各个...
    linshuai阅读 906评论 0 11
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,943评论 0 15
  • 一天,小鸡闷在家里觉得很无聊,就到外面去找朋友玩。 小鸡找到了小猴家,对小猴说:“猴哥,我们交朋友好吗?”小猴说:...
    7念白阅读 720评论 0 0