Jquery结合HTML5实现文件上传


Posted in Javascript onJune 25, 2015

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

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

Javascript 相关文章推荐
jQuery 插件 将this下的div轮番显示
Apr 09 Javascript
js客户端快捷键管理类的较完整实现和应用
Jun 08 Javascript
jQuery-ui中自动完成实现方法
Jun 10 Javascript
基于node.js的快速开发透明代理
Dec 25 Javascript
js中的json对象详细介绍
Oct 29 Javascript
基于jquery实现智能表单验证操作
May 09 Javascript
判断横屏竖屏(三种)
Feb 13 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
js针对图片加载失败的处理方法分析
Aug 24 Javascript
vue实现登录功能
Dec 31 Vue.js
浅谈jQuery.easyui的datebox格式化时间
Jun 25 #Javascript
javascript学习笔记之函数定义
Jun 25 #Javascript
把Node.js程序加入服务实现随机启动
Jun 25 #Javascript
javascript控制台详解
Jun 25 #Javascript
jquery实现浮动的侧栏实例
Jun 25 #Javascript
JQuery实现鼠标移动图片显示描述层的方法
Jun 25 #Javascript
Node.js中的process.nextTick使用实例
Jun 25 #Javascript
You might like
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
js使用递归解析xml
2014/12/12 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
Python多线程的退出控制实现
2020/08/10 Python
Python基于locals返回作用域字典
2020/10/17 Python
师范毕业生个人求职信
2013/12/09 职场文书
公路绿化方案
2014/05/12 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
员工手册编写范本
2015/05/14 职场文书
公司欠款证明
2015/06/24 职场文书
法定代表人免职证明
2015/06/24 职场文书
如何写好竞聘报告
2019/04/03 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
如何使用flask将模型部署为服务
2021/05/13 Python
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android