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 校验中国身份证号码实例详解
Apr 11 jQuery
jQuery实现按比例缩放图片的方法
Apr 29 jQuery
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
May 15 jQuery
jQuery操作之效果详解
May 19 jQuery
jQuery表单验证之密码确认
May 22 jQuery
浅谈struts1 &amp; jquery form 文件异步上传
May 25 jQuery
JQuery.dataTables表格插件添加跳转到指定页
Jun 09 jQuery
jQuery EasyUI开发技巧总结
Sep 26 jQuery
jQuery实现标签子元素的添加和赋值方法
Feb 24 jQuery
详解jQuery中的isPlainObject()使用方法
Feb 27 jQuery
jQuery实现容器间的元素拖拽功能
Dec 01 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网站来路获取代码(针对搜索引擎)
2010/06/08 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
jQuery获取文本节点之 text()/val()/html() 方法区别
2011/03/01 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
jQuery.each使用详解
2015/07/07 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
js继承实现方法详解
2016/12/16 Javascript
jquery 手势密码插件
2017/03/17 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
微信小程序radio组件使用详解
2018/01/31 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
基于jQuery实现可编辑的表格
2019/12/11 jQuery
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
教你用Python写安卓游戏外挂
2018/01/11 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
毕业生在校学习的自我评价分享
2013/10/08 职场文书
医科大学生毕业的自我评价分享
2013/11/12 职场文书
财务总经理岗位职责
2014/02/16 职场文书
群众路线班子对照检查材料
2014/09/25 职场文书
今日说法观后感
2015/06/08 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
公司人事管理制度
2015/08/05 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫