Jquery结合HTML5实现文件上传

前端技术 2023/09/08 JavaScript

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

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

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

2.HTML页面代码如下

 <!DOCTYPE html>
 
 <html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">
   <head>
     <meta charset=\"utf-8\" />
     <title>使用HTML的FormData属性实现文件上传</title>
     <link rel=\"stylesheet\" href=\"../css/fileUpload.css\" />
   </head>
   <body>
     <table id=\"uploadTable\" style=\"border: 1px;\"></table>
     <br/>
     <a href=\"javascript:void(0);\" class=\"input-file\">
       添加文件<input type=\"file\" id=\"txtFile\" style=\"width:200px;\" />
     </a>
     <script type=\"text/javascript\" src=\"../js/jquery-1.7.1-min.js\"></script>
 
     <script type=\"text/javascript\">
       $(function () {
         $(\'#uploadTable\').SalesMOUNDUpload({
           saveUrl: \'/Test/Save\',
           jqInput: $(\'#txtFile\'),
           fnRemove: removeFile,
           fnComplete: function (d) {
             window.console.log(\'complete \' + d);
           }
         });
       });
       function removeFile(d) {
         $.post(\'/Test/Remove\', { \"filename\": d }, function(r) {
           
         });
       }
     </script>
   </body>
 </html>

3.CSS代码如下:

 /*源文件头信息:
 <copyright file=\"FileUpload.js\">
 Copyright(c)2014-2034 Kencery.All rights reserved.
 个人博客:http://www.cnblogs.com/hanyinglong
 创建人:韩迎龙(kencery)
 创建时间:2015-6-24
 </copyright>*/
 
 body
 {
   font-family: \"微软雅黑\";
   font-size: 12px;
 }
 .input-file {
   overflow: hidden;
   position: relative;
 }
 .input-file input {
   opacity: 0;
   filter: alpha(opacity=0);
   font-size: 100px;
   position: absolute;
   top: 0;
   right: 0;
 }
 #uploadTable {
   width: 500px;
   border-collapse: collapse;
   border: 1px solid Silver;
 }

4.JS代码如下:

// 源文件头信息:
// <copyright file=\"FileUpload.js\">
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 创建人:韩迎龙(kencery)
// 创建时间:2015-6-24
// </copyright>
;
(function($) {
  $.fn.SalesMOUNDUpload = function(options) {
    var defaults =
    {
      saveUrl: \'\',
      jqInput: \'\',
      maxSize: 1024 * 1024 * 100, //100M
      fnRemove: \'\', //移除文件 ,参数:文件名
      fnComplete: \'\' //每个文件成功 ,参数:服务器端返回内容
    };
    var opt = $.extend(defaults, options);
    function getByteToM(val) {
      if (isNaN(val)) return val;
      val = val / (1024 * 1024);
      val = Math.round(val * 100) / 100;
      return val;
    }
    return this.each(function() {
      var $this = $(this);
      $this.empty();
      if (typeof FormData == \'undefine\') {
        alert(\'浏览器版本太低,不支持改上传!\');
        return;
      }
      //表头
      if ($this.find(\'thead\').length == 0) {
        var $thead = $(\'<thead>\');
        var $th_tr = $(\'<tr>\');
        $th_tr.append(\'<th>文件名</th>\');
        $th_tr.append(\'<th>类型</th>\');
        $th_tr.append(\'<th>大小</th>\');
        $th_tr.append(\'<th>状态</th>\');
        $th_tr.append(\'<th>操作</th>\');
        $th_tr.appendTo($thead);
        $this.append($thead);
      }
      opt.jqInput[0].addEventListener(\'change\', function(e) {
        var file = this.files[0];
        if (!file) {
          return;
        }
        if (file.size > opt.maxSize) {
          window.alert(\'文件超过最大\');
          return;
        }
        var fd = new FormData();
        var $table = $this;
        fd.append(\"uploadFile\", file);
        var xhr = new XMLHttpRequest();
        xhr.open(\'POST\', opt.saveUrl, true);
        xhr.upload.addEventListener(\"progress\", uploadProgress, false);
        xhr.addEventListener(\"load\", uploadComplete, false);
        xhr.addEventListener(\"error\", uploadFailed, false);
        xhr.addEventListener(\"abort\", uploadCanceled, false);
        //表中内容
        var $tr = $(\'<tr>\');
        $tr.append(\'<td class=\"upload_name\">\' + file.name + \'</td>\');
        $tr.append(\'<td class=\"upload_type\">\' + file.type + \'</td>\');
        $tr.append(\'<td class=\"upload_size\">\' + getByteToM(file.size) + \'M\' + \'</td>\');
        $tr.append(\'<td class=\"upload_status\">\' + 0 + \'</td>\');
        $tr.append(\'<td class=\"upload_action\"><a href=\"javascript:void(0);\">\' + \'取消\' + \'</a></td>\');
        $tr.find(\'.upload_action a\').unbind(\'click\').bind(\'click\', function() {
          xhr.abort();
        });
        $table.append($tr);
        function uploadProgress(evt) {
          if (evt.lengthComputable) {
            var percentComplete = Math.round(evt.loaded * 100 / evt.total);
            $tr.find(\'.upload_status\').html(Math.round(percentComplete) + \'%\');
          } else {
            $tr.find(\'.upload_status\').html(\'unable to compute\');
          }
        }
        function uploadComplete(evt) {
          if (evt.target.status == 200) {
            $tr.find(\'.upload_status\').html(\'已完成\');
            $tr.find(\'.upload_action a\').html(\'删除\');
            if (typeof opt.fnComplete == \'function\') {
              opt.fnComplete(evt.target.response);
            }
            $tr.find(\'.upload_action\').unbind(\'click\').bind(\'click\', removeFile);
          }
        }
        function uploadFailed() {
          $tr.find(\'.upload_status\').html(\'<a href=\"javascript:void(0);\">×</a>\');
          $tr.find(\'.upload_status a\').unbind(\'click\').bind(\'click\', function() {
            $tr.remove();
          });
          $tr.find(\'.upload_action a\').html(\'重试\');
          $tr.find(\'.upload_action a\').unbind(\'click\').bind(\'click\', function() {
            xhr.send(fd);
          });
        }
        function uploadCanceled() {
          $tr.remove();
        }
        function removeFile() {
          $tr.remove();
          if (typeof opt.fnRemove == \'function\') {
            opt.fnRemove(file.name);
          }
        }
        xhr.send(fd);
      }, false);
    });
  };
}(jQuery));

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

以上所述就是本文的全部内容了,希望大家能够喜欢。

本文地址:https://www.stayed.cn/item/23208

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。