PHP群:95885625 Hbuilder+MUI群:81989597 站长QQ:634381967
    您现在的位置: 首页 > 开发编程 > HTML5+CSS3教程 > 正文

    关于input[type=file]如何异步上传文件

    作者:admin来源:网络浏览:时间:2020-09-30 00:07:50我要评论
    导读:我们都知道可以通过ajax请求来异步向服务器提交表单,那是不是其中也包括input[type=file]这个特殊的表单元素呢?如果不可以,那除了flash...
     我们都知道可以通过ajax请求来异步向服务器提交表单,那是不是其中也包括input[type=file]这个特殊的表单元素呢?如果不可以,那除了flash外,还有没有其他的方法可以实现异步提交文件呢?

    如何异步上传文件

    很不幸地,如果只是使用平常我们用的XMLHttpRequest是不行的,因为它并不支持二进制文件的传输,但是注意,我说的是我们平常用的,也就是说还有我们很少用的或者说还未用的,那就是XmlHttpRequest Level 2,它是XMLHttpRequest的新版本,增加了请求时限,文件传输,跨域请求,进度事件等等新的特性。
    下面就是一个简单的利用这些新特性实现的文件异步上传的例子:

    1. <!DOCTYPE html> 
    2. <html lang="en"
    3. <head> 
    4.     <meta charset="UTF-8"
    5.     <title>Document</title> 
    6. </head> 
    7. <body> 
    8.     <input id="file" name="file" type="file"
    9.     <button id="btn" type="button">Upload</button> 
    10.     <script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.js"></script> 
    11.     <script> 
    12.         var $file = $('#file'); 
    13.         $('#btn').click(function() { 
    14.             var data = new FormData(); 
    15.             data.append('file', $file[0].files[0]); 
    16.             data.append('foo''bar'); 
    17.                
    18.             var xhr = new XMLHttpRequest(); 
    19.             xhr.open('post''/upload'); 
    20.             xhr.onload = function(e) { 
    21.                 alert(e.currentTarget.response); 
    22.             } 
    23.             xhr.send(data); 
    24.         }); 
    25.     </script> 
    26. </body> 
    27. </html> 

     唯一令人遗憾的就是,IE9及其以下版本并不支持这些新特性,如果又想兼容IE的低版本怎么办?还好我们可以通过iframe来模拟实现,具体做法就是将input[type=file]包裹上一层<form>,并将它的target属性指向一个隐藏的iframe,通过提交form表单来模拟文件的异步上传,可以参考下面的代码:

    1. <!DOCTYPE html> 
    2. <html lang="en"
    3. <head> 
    4.     <meta charset="UTF-8"
    5.     <title>Document</title> 
    6. </head> 
    7. <body> 
    8.     <input id="file" name="file" type="file"
    9.     <button id="btn" type="button">Upload</button> 
    10.     <script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.js"></script> 
    11.     <script> 
    12.      
    13.         var $file = $('#file'); 
    14.         $('#btn').click(function() { 
    15.             upload({ 
    16.                 url: '/upload'
    17.                 data: { 
    18.                     foo: 'bar' 
    19.                 }, 
    20.                 callback: function(res) { 
    21.                     console.log(res); 
    22.                 } 
    23.             }) 
    24.         }); 
    25.  
    26.         function upload(opts) { 
    27.             var $iframe = $('#uploaderFrame'); 
    28.             if ($iframe.length === 0) { 
    29.                 $iframe = $('<iframe id="uploaderFrame" name="uploaderFrame" style="display:none;"></iframe>'
    30.                 .appendTo('body'
    31.                 .load(function() { 
    32.                     var response, responseStr = $(this).contents().text(); 
    33.                     try { 
    34.                         response = JSON.parse(responseStr); 
    35.                     } catch (e) { 
    36.                         response = responseStr; 
    37.                     } 
    38.  
    39.                     $file.siblings().remove(); 
    40.                     $file.unwrap(); 
    41.  
    42.                     opts.callback(response); 
    43.                 }); 
    44.             } 
    45.  
    46.             $file.wrap('<form action="' + opts.url + '" method="post" enctype="multipart/form-data" target="uploaderFrame"></form>'); 
    47.             var $from = $file.parent(); 
    48.             for (var key in opts.data) { 
    49.                 $from.append('<input type="hidden" name="' + key + '" value="' + opts.data[key] + '">'); 
    50.             } 
    51.             $from.submit(); 
    52.         } 
    53.     </script> 
    54. </body> 
    55. </html> 

     

    另外像jQuery.form.js已经完成了对我上面所说的逻辑的封装,可以直接拿来使用。唯一需要注意的是,如果在IE中使用这种方法来异步提交文件,并且服务器返回的response header的content-type值为application/json,那么IE就会弹出下载json文件的提示,解决的办法是将content-type改为text/html,再在js中通过JSON.parse()转化为对象。

    转载请注明(B5教程网)原文链接:https://b5.mxunkeji.com/content-142-3170-1.html
    相关热词搜索: