继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

关于input type=“file”的及其files对象的深层探究

慕仔4209126
关注TA
已关注
手记 304
粉丝 69
获赞 305

我们都知道,html5中有个input type=file元素。用该元素可以实现页面上传文件的功能

但一般的做法只是简单的在表单中操作,我来研究一下深层东西

想要了解它,就要知道它的内置对象,files

页面上写一个input,然后选俩个图片,打印这个input对象

[javascript] view plain copy

  1. $("input[name='file1']").change( function(e){  

  2.     console.log($("input[name='file1']"))  

  3. })  

发现有下列值,在0中,有一个files对象



我们发现input选择的文件被记录到了这个对象中,这个是fileList对象,是一个只读对象,不能修改

因为它不能修改,所以很难实现对已选中多个文件的删除某个文件等操作

里面记录了文件的name,size,type,和修改时间等,可知这个对象只存放了一些文件的信息,相当于是本地文件的索引,并不是把文件放到input中了,上传文件时它会再去找到实际的本地文件

利用这个files对象,我们可以实现很多功能,例如:

一.选择图片未经后端显示预览图片

方法1:利用window的url工具将文件生成url,再将url赋值给img的src属性,显示出选中图像

顺便提一下,input中控制选中类型加一个accept属性就行了,只会显示设定的文件类型


<input id="file1" type="file"  name="file1" multiple="multiple" accept=".doc,.jpg">
  1. $('.fbpj-camera').change(function(event) {  

  2.         //$('.dianpuzhuangxiu .addmokuai .block .shuoming1 .pic .pic1').children().remove();  

  3.          // 根据这个 <input> 获取文件的 HTML5 js 对象  

  4.         var files = event.target.files, file;          

  5.         if (files && files.length > 0) {  

  6.           // 获取目前上传的文件  

  7.           file = files[0];  

  8.           // 来在控制台看看到底这个对象是什么  

  9.           console.log(file);  

  10.           // 那么我们可以做一下诸如文件大小校验的动作  

  11.           if(file.size > 1024 * 1024 * 2) {  

  12.             alert('图片大小不能超过 2MB!');  

  13.             return false;  

  14.           }  

  15.           // !!!!!!  

  16.           // 下面是关键的关键,通过这个 file 对象生成一个可用的图像 URL  

  17.           // 获取 window 的 URL 工具       

  18.           var URL = window.URL || window.webkitURL;       

  19.           // 通过 file 生成目标 url  

  20.           var imgURL = URL.createObjectURL(file);  

  21.           // 用这个 URL 产生一个 <img> 将其显示出来  

  22.           $('.fbpj .container').prev().find("img").attr('src', imgURL);  

  23.           // 使用下面这句可以在内存中释放对此 url 的伺服,跑了之后那个 URL 就无效了  

  24.              //URL.revokeObjectURL(imgURL);  

  25.          }  

  26.         });  

方法二:利用html5的FileReader()读取文件

*前提是浏览器支持的话

  1. if(window.FileReader) {    

  2.     var fr = new FileReader();    

  3.     // add your code here    

  4. }    

  5. else {    

  6.     alert("Not supported by your browser!");    

  7. }   


  1. <script type="text/javascript">    

  2.         function showPreview(source) {    

  3.             var file = source.files[0];    

  4.             if(window.FileReader) {    

  5.                 var fr = new FileReader();    

  6.                 fr.onloadend = function(e) {    

  7.                     document.getElementById("portrait").src = e.target.result;    

  8.                 };    

  9.                 fr.readAsDataURL(file);  //也是利用将图片作为url读出  

  10.             }    

  11.         }    

  12.     </script>    

  13.     

  14. <input type="file" name="file" onchange="showPreview(this)" />    

  15.                                 <img id="portrait" src="" width="70" height="75">    

FileReader还有一些其他用法

  1. <html>    

  2.   <head>    

  3.   <meta http-equiv="content-type" content="text/html; charset=utf-8">    

  4.   <meta name="author" content="oscar999">    

  5.   <title></title>    

  6.   <script>    

  7.   function  handleFiles(files)    

  8.   {    

  9.     if(files.length)    

  10.     {    

  11.        var file = files[0];    

  12.        var reader = new FileReader();    

  13.        reader.onload = function()    

  14.        {    

  15.            document.getElementById("filecontent").innerHTML = this.result;    

  16.        };    

  17.        reader.readAsText(file);   //作为字符串读出  

  18.     }    

  19.   }    

  20.   </script>    

  21.       

  22.   </head>    

  23.   <body>    

  24.     

  25.   <input type="file" id="file" onchange="handleFiles(this.files)"/>    

  26.   <div id="filecontent"></div>    

  27.   </body>    

  28. </html>    


二.文件拖拽的方法保存文件

关于文件拖拽下面有注释,我主要说一下怎么给用js给input赋值,而不是手动去选文件

因为拖拽的区域只是一个div,无法进行上传操作,所以需要加一个form和input,让拖拽进去的文件进入input中。

取出files后,用$("#file1")[0].files=files;将文件赋值给input,注意赋值的必须是fileList对象,不要试图只放进去一个文件,fileList只读。

然后用h5中的FormData将form转化,提交即可

  1. <html>  

  2. <head>  

  3.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  

  4.     <style>  

  5.         .container{  

  6.             width:300px;height: 300px;  

  7.             border:2px dashed #ddd;  

  8.             text-align: center;  

  9.             padding:50px;  

  10.         }  

  11.     </style>  

  12.     <title>  

  13.         培训活动列表  

  14.     </title>  

  15. </head>  

  16. <body>  

  17. <div class="container">  

  18.     拖拽进入  

  19. </div>  

  20. <form id="form1" method="post" enctype="multipart/form-data">  

  21.     <input type="file" name="file1" id="file1" value="" />  

  22. </form>  

  23. <script type="text/javascript">  

  24.     $('.container').bind('dragenter dragover', ignoreDrag);  

  25.     $(".container").on({drop:function(e){  

  26.         var flag=true;  

  27.         e.preventDefault();  

  28.         //jquery的file要去e.originalEvent里面拿,拖拽获取files的方式与input的不同  

  29.         var files = e.originalEvent.dataTransfer.files;  

  30.         //var files = e.dataTransfer.files;  原生的话这样就可以获取  

  31.         for(var i=0;i<files.length;i++){  

  32.             myFileReader(files[i],function(result,file){  

  33.                 if(result){  

  34.                     //文件  

  35.                     console.log(file.name)  

  36.   

  37.                 }else{  

  38.                     //文件夹  

  39.                     console.log("不要上传文件夹")  

  40.                     flag=false;  

  41.                 }  

  42.             });  

  43.         }  

  44.         if(flag){  

  45.             $("#file1")[0].files=files;   //关键:将取到的文件赋值给input,用于ajax提交文件!!!  

  46.             var formData = new FormData($("#form1")[0]);       

  47.             $.ajax({  

  48.                 url : "/it/orderManage/saveActivity",  

  49.                 type : 'POST',  

  50.                 data : formData,  

  51.                 // 告诉jQuery不要去处理发送的数据  

  52.                 processData : false,  

  53.                 // 告诉jQuery不要去设置Content-Type请求头  

  54.                 contentType : false,  

  55.                 async : true,  

  56.                 success : function(ret) {  

  57.                     //alert("上传成功")  

  58.                     if(ret){  

  59.                         $("#trainInfoModal").modal("hide");  

  60.                         layer.alert("保存成功")  

  61.                         $('#orderTable').bootstrapTable("refresh");  

  62.                         $("#trainInfoModal input").val("");  

  63.                         $("#trainInfoModal textarea").val("");  

  64.   

  65.                     }  

  66.                 }  

  67.             });  

  68.         }  

  69.         console.log(files);  

  70.     }})  

  71.   

  72.     function ignoreDrag(e) {e.originalEvent.stopPropagation();  

  73.         e.originalEvent.preventDefault();  

  74.     }  

  75.   

  76.     function myFileReader(file, callback){  

  77.         if(!window.FileReader){  

  78.             callback(true,file);  

  79.             return false;  

  80.         }  

  81.         var fr = new FileReader();  

  82.         fr.readAsDataURL(file);  

  83.         fr.onload=function(e){  

  84.             callback(true,file);  

  85.         }  

  86.         fr.onerror=function(e){  //不好判断是否是文件夹,通过上传报错可以判断是文件夹  

  87.             callback(false,file);  

  88.         }  

  89.         return true;  

  90.     };  

  91. </script>  

  92. </body>  

  93. </html>  

后台获取文件还是用MutipartFile[]接收

  1. public String saveActivity(@RequestParam HashMap<String, String> param,  

  2.                                //@RequestParam(value = "banner") MultipartFile[] files,  

  3.                                @RequestParam(value = "file1") MultipartFile[] file1,  

  4.                                HttpServletRequest request,  

  5.                                String fileNames,  

  6.                                String TID, HttpServletRequest req) {  

暂时先总结这么多

原文出处

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP