• 利用Jquery使用HTML5的FormData属性实现对文件的上传


    1.利用Jquery使用HTML5的FormData属性实现对文件的上传

      在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我们很容易的实现对文件的上传,只需要利用HTML5的一个FormData属性,结合Jquery就很容易实现文件的上传,而且读取文件的上传进度,下面这个上传案例就是基于上面所说的实现的,下面我将所所有的JS和CSS以及HTML页面代码放在下面。

      注意事项:FormData属性必须依赖于HTML5,所以如果你按照本文代码实现的功能,则浏览器必须升级为最新(支持HTML5 FormData属性)。

    2.HTML页面代码如下

     1 <!DOCTYPE html>
     2 
     3 <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
     4     <head>
     5         <meta charset="utf-8" />
     6         <title>使用HTML的FormData属性实现文件上传</title>
     7         <link rel="stylesheet" href="../css/fileUpload.css" />
     8     </head>
     9     <body>
    10         <table id="uploadTable" style="border: 1px;"></table>
    11         <br/>
    12         <a href="javascript:void(0);" class="input-file">
    13             添加文件<input type="file" id="txtFile" style="200px;" />
    14         </a>
    15         <script type="text/javascript" src="../js/jquery-1.7.1-min.js"></script>
    16 
    17         <script type="text/javascript">
    18             $(function () {
    19                 $('#uploadTable').SalesMOUNDUpload({
    20                     saveUrl: '/Test/Save',
    21                     jqInput: $('#txtFile'),
    22                     fnRemove: removeFile,
    23                     fnComplete: function (d) {
    24                         window.console.log('complete ' + d);
    25                     }
    26                 });
    27             });
    28             function removeFile(d) {
    29                 $.post('/Test/Remove', { "filename": d }, function(r) {
    30                     
    31                 });
    32             }
    33         </script>
    34     </body>
    35 </html>

    3.CSS代码如下:

     1  /*源文件头信息:
     2  <copyright file="FileUpload.js">
     3  Copyright(c)2014-2034 Kencery.All rights reserved.
     4  个人博客:http://www.cnblogs.com/hanyinglong
     5  创建人:韩迎龙(kencery)
     6  创建时间:2015-6-24
     7  </copyright>*/
     8 
     9 body
    10 {
    11     font-family: "微软雅黑";
    12     font-size: 12px;
    13 }
    14 .input-file {
    15     overflow: hidden;
    16     position: relative;
    17 }
    18 .input-file input {
    19     opacity: 0;
    20     filter: alpha(opacity=0);
    21     font-size: 100px;
    22     position: absolute;
    23     top: 0;
    24     right: 0;
    25 }
    26 #uploadTable {
    27     width: 500px;
    28     border-collapse: collapse;
    29     border: 1px solid Silver;
    30 }

    4.JS代码如下:

      1 // 源文件头信息:
      2 // <copyright file="FileUpload.js">
      3 // Copyright(c)2014-2034 Kencery.All rights reserved.
      4 // 个人博客:http://www.cnblogs.com/hanyinglong
      5 // 创建人:韩迎龙(kencery)
      6 // 创建时间:2015-6-24
      7 // </copyright>
      8 
      9 ;
     10 (function($) {
     11     $.fn.SalesMOUNDUpload = function(options) {
     12         var defaults =
     13         {
     14             saveUrl: '',
     15             jqInput: '',
     16             maxSize: 1024 * 1024 * 100, //100M
     17             fnRemove: '', //移除文件 ,参数:文件名
     18             fnComplete: '' //每个文件成功 ,参数:服务器端返回内容
     19         };
     20 
     21         var opt = $.extend(defaults, options);
     22 
     23         function getByteToM(val) {
     24             if (isNaN(val)) return val;
     25             val = val / (1024 * 1024);
     26             val = Math.round(val * 100) / 100;
     27             return val;
     28         }
     29 
     30         return this.each(function() {
     31             var $this = $(this);
     32             $this.empty();
     33 
     34             if (typeof FormData == 'undefine') {
     35                 alert('浏览器版本太低,不支持改上传!');
     36                 return;
     37             }
     38 
     39             //表头
     40             if ($this.find('thead').length == 0) {
     41                 var $thead = $('<thead>');
     42                 var $th_tr = $('<tr>');
     43                 $th_tr.append('<th>文件名</th>');
     44                 $th_tr.append('<th>类型</th>');
     45                 $th_tr.append('<th>大小</th>');
     46                 $th_tr.append('<th>状态</th>');
     47                 $th_tr.append('<th>操作</th>');
     48                 $th_tr.appendTo($thead);
     49                 $this.append($thead);
     50             }
     51 
     52             opt.jqInput[0].addEventListener('change', function(e) {
     53                 var file = this.files[0];
     54 
     55                 if (!file) {
     56                     return;
     57                 }
     58                 if (file.size > opt.maxSize) {
     59                     window.alert('文件超过最大');
     60                     return;
     61                 }
     62                 var fd = new FormData();
     63                 var $table = $this;
     64 
     65                 fd.append("uploadFile", file);
     66                 var xhr = new XMLHttpRequest();
     67                 xhr.open('POST', opt.saveUrl, true);
     68 
     69                 xhr.upload.addEventListener("progress", uploadProgress, false);
     70                 xhr.addEventListener("load", uploadComplete, false);
     71                 xhr.addEventListener("error", uploadFailed, false);
     72                 xhr.addEventListener("abort", uploadCanceled, false);
     73 
     74                 //表中内容
     75                 var $tr = $('<tr>');
     76                 $tr.append('<td class="upload_name">' + file.name + '</td>');
     77                 $tr.append('<td class="upload_type">' + file.type + '</td>');
     78                 $tr.append('<td class="upload_size">' + getByteToM(file.size) + 'M' + '</td>');
     79                 $tr.append('<td class="upload_status">' + 0 + '</td>');
     80                 $tr.append('<td class="upload_action"><a href="javascript:void(0);">' + '取消' + '</a></td>');
     81                 $tr.find('.upload_action a').unbind('click').bind('click', function() {
     82                     xhr.abort();
     83                 });
     84 
     85                 $table.append($tr);
     86 
     87                 function uploadProgress(evt) {
     88                     if (evt.lengthComputable) {
     89                         var percentComplete = Math.round(evt.loaded * 100 / evt.total);
     90                         $tr.find('.upload_status').html(Math.round(percentComplete) + '%');
     91                     } else {
     92                         $tr.find('.upload_status').html('unable to compute');
     93                     }
     94                 }
     95 
     96                 function uploadComplete(evt) {
     97                     if (evt.target.status == 200) {
     98                         $tr.find('.upload_status').html('已完成');
     99                         $tr.find('.upload_action a').html('删除');
    100                         if (typeof opt.fnComplete == 'function') {
    101                             opt.fnComplete(evt.target.response);
    102 
    103                         }
    104                         $tr.find('.upload_action').unbind('click').bind('click', removeFile);
    105                     }
    106                 }
    107 
    108                 function uploadFailed() {
    109                     $tr.find('.upload_status').html('<a href="javascript:void(0);">×</a>');
    110                     $tr.find('.upload_status a').unbind('click').bind('click', function() {
    111                         $tr.remove();
    112                     });
    113                     $tr.find('.upload_action a').html('重试');
    114                     $tr.find('.upload_action a').unbind('click').bind('click', function() {
    115                         xhr.send(fd);
    116                     });
    117                 }
    118 
    119                 function uploadCanceled() {
    120                     $tr.remove();
    121                 }
    122 
    123                 function removeFile() {
    124                     $tr.remove();
    125                     if (typeof opt.fnRemove == 'function') {
    126                         opt.fnRemove(file.name);
    127                     }
    128                 }
    129 
    130                 xhr.send(fd);
    131             }, false);
    132         });
    133     };
    134 }(jQuery));

    5.代码查看地址:https://github.com/kencery/Common/tree/master/KenceryCommonMethod/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0

  • 相关阅读:
    混淆矩阵求解(多分类与单分类)
    pytorch权重转wts格式,用于tensorrt权重加载
    触摸按键控制器TTP229BSF使用心得[原创cnblogs.com/helesheng]
    腾讯云主机配置FTP INnoVation
    【转】PV操作,看完了进程同步与互斥机制,我终于彻底理解了 PV 操作
    C++使用正则时碰到一个奇怪的问题
    DLL中使用vector的问题
    Docker镜像操作 测试
    剖析虚幻渲染体系(16) 图形驱动的秘密
    20225前端渡劫汇总
  • 原文地址:https://www.cnblogs.com/hanyinglong/p/4597525.html
Copyright © 2020-2023  润新知