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 jqxScrollBar min属性

    jqxScrollBar是jQWidgets库中的一个组件,它提供了一个滚动条,可以用于在页面中滚动内容。jqxScrollBar具有许多可配置的属性和方法,用于自定义滚动条的外观和行为。其中一个重要的属性是min,它可以用于指定滚动条的最小值。以下是min属性的完整攻略: min属性 min属性用于指定滚动条的最小值。该属性接受一个数字作为参数,该数字将用…

    jquery 2023年5月12日
    00
  • jQuery中on()方法用法实例

    下面是关于“jQuery中on()方法用法实例”的详细攻略: 一、什么是on()方法 on()是jquery中的一个事件绑定方法,同时它也是jquery推荐使用的事件绑定方式。通过on()方法可以实现对目标元素的多个事件进行绑定,并且可以动态绑定事件,该方法支持链式调用,使用方便。 二、on()方法的语法格式 on()方法的基本语法如下: $(selecto…

    jquery 2023年5月27日
    00
  • jQuery extend()方法

    jQuery extend()方法用于将一个或多个对象的内容合并到目标对象中。本文将详细介绍extend()方法的语法用法,并提供两个示例说明。 语法 以下是extend()方法的基本语法: $.extend(target, object1 object2, …) 在这个语法中,target是目标对象,object1、object2等是要合并到目标对象中…

    jquery 2023年5月9日
    00
  • JQuery AJAX提交中文乱码的解决方案

    请允许我详细讲解“JQuery AJAX提交中文乱码的解决方案”的完整攻略。 1. 了解中文乱码的原因 在介绍解决方案之前,我们先来了解一下中文乱码的原因。主要有两个因素: 编码方式不一致:数据在客户端和服务端之间传输时,使用的编码方式不一致,导致中文乱码。 服务器无法解析请求数据:服务器端未能正确解析请求数据,导致中文乱码。 2. 解决方案 为了解决中文乱…

    jquery 2023年5月28日
    00
  • jQWidgets jqxCheckBox indeterminate()方法

    当需要将 jqxCheckBox 组件设置为不确定状态时,可以使用 indeterminate() 方法。本文将详细介绍 jQWidgets jqxCheckBox 的 indeterminate() 方法,包括方法概述、示例说明以及使用注意事项。 indeterminate() 方法概述 indeterminate() 方法用于将 jqxCheckBox …

    jquery 2023年5月11日
    00
  • Jquery元素追加和删除的实现方法

    Jquery是一个非常流行的Javascript框架,它可以方便地实现在网页中对元素的追加和删除。本文将为大家介绍Jquery元素追加和删除的实现方法。 Jquery元素追加的实现方法 对于元素的追加,Jquery提供了非常简单的API——append、appendTo、prepend、prependTo、after和before。这些API的含义如下: a…

    jquery 2023年5月28日
    00
  • 基于axios请求封装的vue应用实例代码

    下面就是基于axios请求封装的vue应用实例代码的完整攻略。 什么是axios? axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js。它是一个很流行的JavaScript库,常用于跨域请求和RESTful API。axios总的来说,比jQuery、fetch等其他的HTTP库更加强大,也更加易用。 axios如何在Vue项目中…

    jquery 2023年5月28日
    00
  • jQWidgets jqxPanel sizeMode属性

    以下是关于 jQWidgets jqxPanel 组件中 sizeMode 属性的详细攻略。 jQWidgets jqxPanel sizeMode 属性 jQWidgets jqxPanel 组件的 sizeMode 属性用于设置面板的大小模式。 语法 $(‘#panel’).jqxPanel({ sizeMode: ‘fixed’ }); 示例 以下两个…

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