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中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
Apr 04 jQuery
最常用的jQuery表单验证(简单)
May 23 jQuery
jquery+css实现侧边导航栏效果
Jun 12 jQuery
jQuery实现的事件绑定功能基本示例
Oct 11 jQuery
js和jQuery以及easyui实现对下拉框的指定赋值方法
Jan 23 jQuery
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
jQuery实现的中英文切换功能示例
Jan 11 jQuery
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
jQuery zTree树插件的使用教程
Aug 16 jQuery
jQuery高级编程之js对象、json与ajax用法实例分析
Nov 01 jQuery
jQuery弹框插件使用方法详解
May 26 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
php google或baidu分页代码
2009/11/26 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
JS实现图片拖拽交换效果
2018/11/30 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
Python中单例模式总结
2018/02/20 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
期中考试反思800字
2014/05/01 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
入党自荐书范文
2015/03/05 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技