jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】


Posted in jQuery onJune 06, 2019

本文实例讲述了jquery+ajax实现上传图片并显示上传进度功能。分享给大家供大家参考,具体如下:

jquery上传文件用的formdata,上传进度条需要添加xhr的onprogress

html代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  <title>Ding Jianlong Html</title>
  <link href="https://cdnjs.cloudflare.com/ajax/libs/layer/2.3/skin/layer.css" rel="external nofollow" rel="stylesheet">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/layer/2.3/layer.js"></script>
</head>
<body>
 <!-- 外层div 进度条的整体视觉和位置设置 -->
  <div style="width:300px;height: 20px;border: 1px solid #CCC;">
  <!-- 内层div 逐渐递增的进度条 -->
    <div id="jdt" style="height: 20px;"></div>
  </div>
  <p>总大小<span id="total"></span>;已上传<span id="loaded"></span>;</p><br>
  <form id="mainForm">
    选择文件:<input type="file" name="file">
    <input type="button" value="上传" onclick="upload()">
  </form>
<script>
  var uploading = false;
 function upload(){
    //首先封装一个方法 传入一个监听函数 返回一个绑定了监听函数的XMLHttpRequest对象
    var xhrOnProgress=function(fun) {
      xhrOnProgress.onprogress = fun; //绑定监听
      //使用闭包实现监听绑
      return function() {
        //通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
        var xhr = $.ajaxSettings.xhr();
        //判断监听函数是否为函数
        if (typeof xhrOnProgress.onprogress !== 'function')
          return xhr;
        //如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
        if (xhrOnProgress.onprogress && xhr.upload) {
          xhr.upload.onprogress = xhrOnProgress.onprogress;
        }
        return xhr;
      }
    }
    var data = new FormData($('#mainForm')[0]); //要加【0】
    console.log(data);
    if(uploading){
      layer.alert("文件正在上传中,请稍候");
      return false;
    }
    $.ajax({
      type: 'POST',
      url: 'upload_file.php',  //当前路径
      data: data,
      dataType: 'json',
      processData: false,  //序列化,no
      contentType: false,  //不设置内容类型
      beforeSend: function(){
        uploading = true;
      },
      //进度条要调用原生xhr
      xhr:xhrOnProgress(function(evt){
        var percent = Math.floor(evt.loaded / evt.total*100);//计算百分比
        console.log(percent);
        // 设置进度条样式
        $('#jdt').css('width',percent * 3 + 'px');
        $('#jdt').css('background','skyblue');
        //显示进度百分比
        $('#jdt').text(percent+'%');
        $('#loaded').text(evt.loaded/1024 + 'K');
        $('#total').text(evt.total/1024 + 'K');
      }),
      success: function (data) {
        if (data.code == 200) {
          layer.msg(data.message, {icon: 1, time: 1000});
          //成功后关闭修改页
          setTimeout(function(){
            var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe的索引
            parent.layer.close(index);  //在执行关闭
          } ,2000);
          //还有刷新下iframe的界面
          parent.location.reload();
        } else {
          layer.msg(data.message, {icon: 2, time: 3000});
        }
        uploading = false;
      },
      error: function (data) {
        alert('服务异常,请稍后重试');
        console.log(data);
      }
    });
  }
</script>
</body>
</html>

php代码如下:

<?php
header('content-type:text/html;charset=utf-8');
if ($_FILES["file"]["error"] > 0)
{
 echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
 // 文件中文转码
 //iconv('utf-8', 'gbk', $_FILES["file"]["name"]);
  //取出后缀名
  $ext = strrchr($_FILES["file"]["name"],'.');
  move_uploaded_file($_FILES["file"]["tmp_name"],
   "upload/" . uniqid() . $ext);
  $arr['code'] = 666;
  $arr['message'] = "已经保存到: " . "upload/" . uniqid() . $ext;
  echo json_encode($arr);die;
}

参考资料: https://3water.com/article/94853.htm

希望本文所述对大家jQuery程序设计有所帮助。

jQuery 相关文章推荐
jquery实现提示语淡入效果
May 05 jQuery
jQuery Jsonp跨域模拟搜索引擎
Jun 17 jQuery
jQuery绑定事件方法及区别(bind,click,on,live,one)
Aug 14 jQuery
jquery实现倒计时小应用
Sep 19 jQuery
jQuery实现动态添加节点与遍历节点功能示例
Nov 09 jQuery
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
JQuery事件冒泡和默认行为代码实例
May 13 jQuery
jQuery实现动态加载瀑布流
Sep 01 jQuery
JS+JQuery实现无缝连接轮播图
Dec 30 jQuery
jQuery操作cookie的示例代码
Jun 05 #jQuery
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
Jun 04 #jQuery
javascript异步处理与Jquery deferred对象用法总结
Jun 04 #jQuery
一文快速了解JQuery中的AJAX
May 31 #jQuery
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 #jQuery
jQuery模拟html下拉多选框的原生实现方法示例
May 30 #jQuery
JS拖动选择table里的单元格完整实例【基于jQuery】
May 28 #jQuery
You might like
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
smarty表格换行实例
2014/12/15 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
浅谈js算法和流程控制
2016/12/29 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python创建关联数组(字典)的方法
2015/05/04 Python
Python实现高效求解素数代码实例
2015/06/30 Python
Python的装饰器使用详解
2017/06/26 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Python实现括号匹配方法详解
2020/02/10 Python
Python使用xlrd实现读取合并单元格
2020/07/09 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
内刊编辑求职自荐书范文
2014/02/19 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
4s店活动策划方案
2014/08/25 职场文书
早读课迟到检讨书
2014/09/25 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
自信主题班会
2015/08/14 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python