返回 导航

其他

hangge.com

JS - 文件上传组件WebUploader使用详解6(图片上传1:带缩略图预览)

作者:hangge | 2019-01-23 08:10
    无论在 PC 端还是移动端,图片上传功能都很常见。与普通的文件上传相比,图片上传通常还需要实现文件过滤、图片预览、图片压缩等功能。下面通过样例进行演示。
关于图片压缩:默认情况下,如果是 jpeg 图片,在上传前 WebUploader 会自动对其压缩一把再上传。我们可以在初始化配置中修改压缩参数,或者改成不压缩。

1,效果图

  • 点击“选择图片”按钮后,弹出文件选择框,并且只允许选择图片类型的文件。
  • 图片选择完毕后会生成缩略图显示在页面上,并且开始自动上传。
  • 对于 jpeg 图片,上传前会压缩一把再上传。
  • 上传的过程中,缩略图上方会实时显示当前的进度条。
  • 当上传成功后,缩略图上方会显示成功信息。
  • 而上传失败时,缩略图上方会显示失败信息。

2,样例代码

(1)客户端代码(index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <!--引入CSS-->
    <link rel="stylesheet" type="text/css" href="webuploader/webuploader.css">
    <!--引入JS-->
    <script type="text/javascript" src="js/jquery-1.11.1.js"></script>
    <script type="text/javascript" src="webuploader/webuploader.js"></script>
    <script type="text/javascript">
      $(function() {
        //文件信息显示区域
        var $list = $('#fileList');
        // 设备像素比
        var ratio = window.devicePixelRatio || 1;
        // 显示的缩略图大小
        var thumbnailWidth = 100 * ratio;
        var thumbnailHeight = 100 * ratio;

        //初始化Web Uploader
        var uploader = WebUploader.create({
            // 选完文件后,是否自动上传。
            auto: true,
            // swf文件路径
            swf: 'webuploader/Uploader.swf',
            // 文件接收服务端。
            server: 'http://www.hangge.com/upload.php',
            // 选择文件的按钮。可选。
            // 内部根据当前运行是创建,可能是input元素,也可能是flash.
            pick: '#picker',
            // 只允许选择图片文件。
            accept: {
               title: 'Images',
               extensions: 'gif,jpg,jpeg,bmp,png',
               mimeTypes: 'image/*'
            }
        });

        // 当有文件被添加进队列的时候(选择文件后调用)
        uploader.on( 'fileQueued', function( file ) {
          var $li = $(
                  '<div id="' + file.id + '" class="file-item thumbnail">' +
                      '<img>' +
                      '<div class="info">' + file.name + '</div>' +
                  '</div>'
                  ),
              $img = $li.find('img');
          // $list为容器jQuery实例
          $list.append( $li );
          // 创建缩略图
          // 如果为非图片文件,可以不用调用此方法。
          // thumbnailWidth x thumbnailHeight 为 100 x 100
          uploader.makeThumb( file, function( error, src ) {
              if ( error ) {
                  $img.replaceWith('<span>不能预览</span>');
                  return;
              }
              $img.attr( 'src', src );
          }, thumbnailWidth, thumbnailHeight );
        });

        // 文件上传过程中创建进度条实时显示。
        uploader.on( 'uploadProgress', function( file, percentage ) {
          var $li = $( '#'+file.id ),
              $percent = $li.find('.progress span');
          // 避免重复创建
          if ( !$percent.length ) {
              $percent = $('<p class="progress"><span></span></p>')
                      .appendTo( $li )
                      .find('span');
          }
          $percent.css( 'width', percentage * 100 + '%' );
        });

        // 文件上传成功,给item添加成功class, 用样式标记上传成功。
        uploader.on( 'uploadSuccess', function( file ) {
            var $li = $( '#'+file.id ),
                $success = $li.find('div.success');
            // 避免重复创建
            if ( !$success.length ) {
                $success = $('<div class="success"></div>').appendTo( $li );
            }
            $success.text('上传成功');
        });

        // 文件上传失败后会调用,显示上传出错。
        uploader.on( 'uploadError', function( file ) {
          var $li = $( '#'+file.id ),
              $error = $li.find('div.error');
          // 避免重复创建
          if ( !$error.length ) {
              $error = $('<div class="error"></div>').appendTo( $li );
          }
          $error.text('上传失败');
        });

        // 文件上传完毕后会调用,删除进度条。(不管成功还是失败)
        uploader.on( 'uploadComplete', function( file ) {
            $( '#'+file.id ).find('.progress').remove();
        });
      });
    </script>
    <style>
      #uploader-demo {
        position: relative;
        padding: 45px 15px 15px;
        margin: 15px 0;
        background-color: #fafafa;
        box-shadow: inset 0 3px 6px rgba(0, 0, 0, .05);
        border-color: #e5e5e5 #eee #eee;
        border-style: solid;
        border-width: 1px 0;
      }
      #uploader-demo .thumbnail {
        width: 110px;
        height: 110px;
      }
      #uploader-demo .thumbnail img {
        width: 100%;
      }
      .uploader-list {
        width: 100%;
        overflow: hidden;
      }
      .file-item {
        float: left;
        position: relative;
        margin: 0 20px 20px 0;
        padding: 4px;
      }
      .file-item .error {
        position: absolute;
        top: 4px;
        left: 4px;
        right: 4px;
        background: red;
        color: white;
        text-align: center;
        height: 20px;
        font-size: 14px;
        line-height: 23px;
      }
      .file-item .success {
        position: absolute;
        top: 4px;
        left: 4px;
        right: 4px;
        background: green;
        color: white;
        text-align: center;
        height: 20px;
        font-size: 14px;
        line-height: 23px;
      }
      .file-item .info {
        position: absolute;
        left: 4px;
        bottom: 4px;
        right: 4px;
        height: 20px;
        line-height: 20px;
        text-indent: 5px;
        background: rgba(0, 0, 0, 0.6);
        color: white;
        overflow: hidden;
        white-space: nowrap;
        text-overflow : ellipsis;
        font-size: 12px;
        z-index: 10;
      }
      .file-item .progress {
        position: absolute;
        right: 4px;
        top: 4px;
        height: 3px;
        left: 4px;
        height: 4px;
        overflow: hidden;
        z-index: 15;
        margin:0;
        padding: 0;
        border-radius: 0;
        background: transparent;
      }
      .file-item .progress span {
        display: block;
        overflow: hidden;
        width: 0;
        height: 100%;
        background: green;
      }
    </style>
  </head>
  <body>
    <!--dom结构部分-->
    <div id="uploader-demo">
        <!--用来存放item-->
        <div id="fileList" class="uploader-list"></div>
        <div id="picker">选择图片</div>
    </div>
  </body>
</html>

(2)服务端代码(upload.php
服务端代码见我之前写的这篇文章:JS - 文件上传组件WebUploader使用详解1(带进度的文件上传)
评论

全部评论(0)

回到顶部