Jquery插件之多图片异步上传

Jquery插件之多图片异步上传的完整攻略如下:

1. 异步上传图片的原理

异步上传图片使用Ajax技术,通过将图片转换成二进制数据流,并通过FormData对象封装后发送到服务器,实现图片的上传,并在服务器端处理上传的图片数据。

2. 编写多图片异步上传插件的步骤

2.1 HTML部分

首先,需要在HTML文件中引入以下代码:

<div class="upload-area">
  <div id="upload-btn" class="btn btn-primary">上传图片</div>
  <ul id="upload-list"></ul>
</div>

其中,upload-area为上传区域的包裹元素,upload-btn为触发上传图片的按钮,upload-list为展示上传图片的列表。

2.2 CSS部分

其次,可以对上传区域的样式进行调整:

.upload-area {
  position: relative;
  width: 400px;
  height: 200px;
  border: 2px dashed #ccc;
  text-align: center;
}

#upload-btn {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

#upload-list {
  margin-top: 20px;
  padding: 0;
  list-style: none;
  overflow: hidden;
}

#upload-list li {
  float: left;
  display: inline-block;
  margin-right: 10px;
  margin-bottom: 10px;
  position: relative;
}

#upload-list li .delete-btn {
  position: absolute;
  top: -5px;
  right: -5px;
  width: 20px;
  height: 20px;
  line-height: 20px;
  text-align: center;
  background-color: #ccc;
  color: #fff;
  font-size: 12px;
  cursor: pointer;
  border-radius: 50%;
}

2.3 JS部分

最后,需要编写JQuery插件的JS部分。以下是完整的代码:

(function($) {
  $.fn.multiUpload = function(options) {
    var defaults = {
      url: '', // 上传图片路径
      allowTypes: ['jpg', 'jpeg', 'png', 'gif'], // 允许上传的图片类型
      maxSize: 5*1024*1024, // 允许上传的单张图片最大大小,默认为5MB
      maxCount: 8 // 允许上传的最大图片数,默认为8张
    };
    var opts = $.extend({}, defaults, options);

    var $uploadArea = $(this),
        $uploadBtn = $uploadArea.find('#upload-btn'),
        $uploadList = $uploadArea.find('#upload-list');

    // 判断浏览器是否支持FormData以及XMLHttpRequest对象
    if (!window.FormData || !window.XMLHttpRequest) {
      alert('您的浏览器不支持上传图片功能,请升级您的浏览器!');
      return;
    }

    // 显示已上传的图片
    showUploadedImages();

    // 绑定上传图片事件
    $uploadBtn.on('click', function() {
      // 判断上传图片的数量是否超过最大值
      if ($uploadList.children('li').length >= opts.maxCount) {
        alert('最多只能上传' + opts.maxCount + '张图片!');
        return;
      }

      // 创建input元素,用于选择图片
      var $input = $('<input type="file"/>');
      $input.css({
        'opacity': '0',
        'position': 'absolute',
        'left': '0',
        'top': '0',
        'width': '100%',
        'height': '100%',
        'cursor': 'pointer'
      });

      // 添加到上传区域
      $uploadArea.append($input);

      // 绑定图片选择事件
      $input.on('change', function() {
        var file = this.files[0];

        // 判断图片类型是否符合要求
        if (!checkFileType(file.type)) {
          alert('仅支持上传jpg、jpeg、png、gif格式的图片!');
          return;
        }

        // 判断图片大小是否符合要求
        if (file.size > opts.maxSize) {
          alert('上传的图片不能大于' + (opts.maxSize/1024/1024).toFixed(2) + 'MB!');
          return;
        }

        // 创建FormData对象
        var formData = new FormData();
        formData.append('file', file);

        // 发送AJAX请求,上传图片
        $.ajax({
          url: opts.url,
          type: 'POST',
          data: formData,
          processData: false,
          contentType: false,
          success: function(data) {
            // 添加图片到列表
            var $item = $('<li></li>').appendTo($uploadList);
            $('<img src="' + data.url + '"/><span class="delete-btn">×</span>').appendTo($item);

            // 移除input元素
            $input.remove();
          }
        });
      });

      // 模拟点击事件,触发选择图片操作
      $input.trigger('click');
    });

    // 删除已上传的图片
    $uploadList.on('click', '.delete-btn', function() {
      $(this).closest('li').remove();
    });

    // 检查上传的文件类型是否符合要求
    function checkFileType(fileType) {
      var isAllowed = false;
      for (var i=0; i<opts.allowTypes.length; i++) {
        if (fileType === 'image/' + opts.allowTypes[i]) {
          isAllowed = true;
          break;
        }
      }
      return isAllowed;
    }

    // 显示已上传的图片
    function showUploadedImages() {
      $.ajax({
        url: opts.url,
        type: 'GET',
        dataType: 'json',
        success: function(data) {
          if (data && data.length) {
            for (var i=0; i<data.length; i++) {
              var $item = $('<li></li>').appendTo($uploadList);
              $('<img src="' + data[i].url + '"/><span class="delete-btn">×</span>').appendTo($item);
            }
          }
        }
      });
    }
  };
})(jQuery);

3. 示例说明

3.1 示例一

使用多图片异步上传插件的示例代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>多图片异步上传</title>
  <link rel="stylesheet" href="multi-upload.css">
</head>
<body>
  <div class="upload-area">
    <div id="upload-btn" class="btn btn-primary">上传图片</div>
    <ul id="upload-list"></ul>
  </div>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="multi-upload.js"></script>
  <script>
    $(function() {
      $('.upload-area').multiUpload({
        url: 'upload.php'
      });
    });
  </script>
</body>
</html>

其中,upload.php是服务器端处理上传图片的代码,示例如下:

<?php
header('Content-Type: application/json; charset=utf-8');

$file = $_FILES['file'];
$fileName = $file['name'];
$fileSize = $file['size'];
$fileTemp = $file['tmp_name'];

$baseDir = 'uploads/';
if (!file_exists($baseDir)) {
  mkdir($baseDir);
}
$ext = pathinfo($fileName, PATHINFO_EXTENSION);
$newName = md5(uniqid(microtime(), true)) . '.' . $ext;
if (move_uploaded_file($fileTemp, $baseDir . $newName)) {
  echo json_encode(array('url' => $baseDir . $newName));
} else {
  echo json_encode(array('error' => '上传图片失败!'));
}
?>

该示例的效果可以参考以下代码片段:

https://codepen.io/mario_kart/pen/yorMmJy

3.2 示例二

使用多图片异步上传插件和jQuery.validate插件实现上传图片表单验证的示例代码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>上传图片</title>
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css">
  <link rel="stylesheet" href="//cdn.bootcss.com/jquery.bootstrapvalidator/0.5.2/css/bootstrapValidator.min.css">
  <link rel="stylesheet" href="multi-upload.css">
</head>
<body>
  <form id="image-form" action="upload.php" method="POST" enctype="multipart/form-data">
    <div class="upload-area">
      <div id="upload-btn" class="btn btn-primary">添加图片</div>
      <ul id="upload-list"></ul>
    </div>

    <button type="submit" class="btn btn-primary">提交</button>
  </form>

  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
  <script src="//cdn.bootcss.com/jquery.bootstrapvalidator/0.5.2/js/bootstrapValidator.min.js"></script>
  <script src="multi-upload.js"></script>
  <script>
    $(function() {
      $('#image-form').bootstrapValidator({
        excluded: ':disabled', // 忽略隐藏、禁用的元素
        feedbackIcons: { // 验证错误时显示的图标
          valid: 'glyphicon glyphicon-ok',
          invalid: 'glyphicon glyphicon-remove',
          validating: 'glyphicon glyphicon-refresh'
        },
        fields: {
          file: {
            validators: {
              notEmpty: { message: '请选择您要上传的图片!' },
              file: {
                extension: 'jpg,jpeg,png,gif',
                type: 'image/jpg,image/jpeg,image/png,image/gif',
                maxSize: 5 * 1024 * 1024,
                message: '仅支持上传大小不超过5MB的图片,文件类型必须是jpg、jpeg、png、gif格式!'
              }
            }
          }
        }
      });

      $('.upload-area').multiUpload({
        url: 'upload.php'
      });
    });
  </script>
</body>
</html>

该示例需要引入jQuery.ui和jQuery.validate插件,upload.php的代码同上一个示例。

该示例的效果可以参考以下代码片段:

https://codepen.io/mario_kart/pen/LYePBZo

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Jquery插件之多图片异步上传 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQWidgets jqxDocking pinWindow()方法

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxDocking,它是一个用于创建可拖动窗口的控件。jqxDocking 组件提供多个方法,其中之一是 pinWindow()。下面是关于 jqxDocking 的 pinWindow() 方法的详细攻略: pinWindow() 方法概述 …

    jquery 2023年5月11日
    00
  • jQWidgets jqxSplitter orientation属性

    jQWidgets是一套基于jQuery的UI组件库,其中包括了一个分割器组件(jqwidgets.jqxsplitter.js),它可以将页面中的元素通过拖拽方式划分为几个细分的区域,以便用户可以自由调整各个区域的大小和位置。 其中,jqxSplitter中的orientation属性指定了分割器的方向。具体而言,它可以取两个值:horizontal和ve…

    jquery 2023年5月11日
    00
  • jQWidgets jqxGrid groupcolumnrenderer属性

    以下是关于“jQWidgets jqxGrid groupcolumnrenderer属性”的完整攻略,包含两个示例说明: 属性简介 jqxGrid 控件的 groupcolumnrenderer 属性用于指定分组列的渲染方式。该属性的默认值为 null,表示使用默认的渲染方式。当该属性设置为函数时,jqxGrid 控件将使用该函数来渲染分组列。属性的语法如…

    jquery 2023年5月10日
    00
  • jQWidgets的jqxChart切换事件

    jQWidgets 是一个流行的 JavaScript UI 库,提供了许多可定制的 UI 组件。其中一个组件是 jqxChart,它是用于绘制图表的组件。jqxChart 提供多个事件,其中之一是 seriesToggle。下面是关于 jqxChart 的 seriesToggle 事件的详细攻略: seriesToggle 事件概述 seriesTogg…

    jquery 2023年5月11日
    00
  • jQWidgets jqxGrid updaterow()方法

    jQWidgets jqxGrid updaterow()方法 jQWidgets jqxGrid 是一种表格控件,用于在 Web 应用程序中创建表格。updaterow() 方法是 jqxGrid 控件的一个方法,用于更新 jqxGrid 控件中的一行数据。本文将详细讲解 updaterow() 方法的使用方法,并提供两个示例。 方法 updaterow(…

    jquery 2023年5月10日
    00
  • Angularjs编写KindEditor,UEidtor,jQuery指令

    AngularJS 1.x版本提供了一种称为指令的机制,让开发者可以扩展HTML元素的功能,这个特殊的标记通常用来创建可重用的组件。 本篇攻略将带你从头到尾学习如何编写三种非常流行的富文本编辑器指令:KindEditor,UEditor和jQuery。 准备工作 在开始之前,我们需要做一些准备工作: 确保你已经安装了AngularJS 1.x版本。 下载并解…

    jquery 2023年5月27日
    00
  • jQWidgets jqxNavBar popupAnimationDelay属性

    以下是关于 jQWidgets jqxNavBar 组件中 popupAnimationDelay 属性的详细攻略。 jQWidgets jqxNavBar popupAnimationDelay 属性 jQWidgets jqxNavBar 组件的 popupAnimationDelay 属性用于设置导航栏弹出动画的延迟时间。该属性可以是数字,表示以毫秒为…

    jquery 2023年5月12日
    00
  • jquery中的常见问题及快速解决方法小结

    当在使用 jQuery 过程中,我们经常会遇到各种各样的问题。这里整理了一些 jQuery 中常见的问题及其快速解决方法,帮助开发者更好地使用 jQuery。 如何使用jQuery? jQuery 是一个 JavaScript 库,它可以让开发者更方便地对文档进行操作、处理事件、效果处理等。在使用 jQuery 之前,需要先引入 jQuery 库。可以从 j…

    jquery 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部