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实现前端分页功能
Mar 23 jQuery
jQuery中map函数的两种方式
Apr 07 jQuery
jQuery Form插件使用详解_动力节点Java学院整理
Jul 17 jQuery
jquery实现左右轮播切换效果
Jan 01 jQuery
jquery 实现拖动文件上传加载进度条功能
Mar 18 jQuery
jQuery实现鼠标移到某个对象时弹出显示层功能
Aug 23 jQuery
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
jQuery使用each遍历循环的方法
Sep 19 jQuery
详解webpack引用jquery(第三方模块)的三种办法
Aug 21 jQuery
Jquery让form表单异步提交代码实现
Nov 14 jQuery
jQuery实现简单聊天室
Feb 08 jQuery
jQuery表单校验插件validator使用方法详解
Feb 18 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
PHP的FTP学习(二)[转自奥索]
2006/10/09 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
php获取微信openid方法总结
2019/10/10 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
javascript 正则表达式相关应介绍
2012/11/27 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
解决python大批量读写.doc文件的问题
2018/05/08 Python
使用11行Python代码盗取了室友的U盘内容
2018/10/23 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
python logging.info在终端没输出的解决
2020/05/12 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
提高EJB性能都有哪些技巧
2012/03/25 面试题
房地产开发计划书
2014/01/10 职场文书
我未来的职业规划范文
2014/01/11 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL