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弹幕效果
May 06 jQuery
jQuery用户头像裁剪插件cropbox.js使用详解
Jun 07 jQuery
jquery加载单文件vue组件的方法
Jun 20 jQuery
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 jQuery
解决JQuery全选/反选第二次失效的问题
Oct 11 jQuery
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
vue.js2.0点击获取自己的属性和jquery方法
Feb 23 jQuery
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
jQuery实现合并表格单元格中相同行操作示例
Jan 28 jQuery
jQuery操作选中select下拉框的值代码实例
Feb 07 jQuery
用jQuery实现抽奖程序
Apr 12 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
法压式咖啡之制作法
2021/03/03 冲泡冲煮
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
php中的依赖注入实例详解
2019/08/14 PHP
JQuery select标签操作代码段
2010/05/16 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
javascript实现简单查找与替换的方法
2015/07/22 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
对vux点击事件的优化详解
2018/08/28 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python实现数据图表
2017/07/29 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
Python PO设计模式的具体使用
2019/08/16 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
解决pyshp UnicodeDecodeError的问题
2019/12/06 Python
Python assert关键字原理及实例解析
2019/12/13 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
局部内部类是否可以访问非final变量?
2013/04/20 面试题
学期研究性学习个人的自我评价
2014/01/09 职场文书
小学教师培训方案
2014/06/09 职场文书
挂职个人工作总结
2015/03/05 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS