php + WebUploader实现图片批量上传功能


Posted in PHP onMay 06, 2019

一.webuploader

webuploader主要用来做文件的上传,支持批量上传和图片预览,图片预览是将图片生成base64数据直接在标签中使用,所以能够达到的效果是未真正上传图片可以先看到上传的效果。更多具体的介绍,可以上webuploader的官方网址看,我一直认为,看官网文档是学习最直接的途径。 webuploader官方网站,顺带一提,webuploader是由Baidu Fex Team团队进行维护的。

二. webuploader上传原理

1. PHP+HTML表单上传文件

在讲这个之前,需要先了解一下php的文件上传方式,上传分两个部分

先通过html创建表单,在表单中添加

<input type='file' name='xxx'>

的文件上传标签,点击上传的submit 按钮之后,就可以将文件上传到服务器了。

2. 到了服务器端,接收到的上传文件会被存储在php指定的临时文件夹中,利用PHP的内置函数move_uploaded_file(),就可以将临时文件移动到你想要的目标文件夹中,这个过程可以对文件进行改名、做大小判断是否符合条件等,这样上传就完成了。

完整的php表单上传案例,可以看w3school的这篇文章,这里就不累赘了。PHP+HTML表单上传文件

2. webuploader上传原理

使用php+html表单上传可以完成文件的上传工作,但是有缺点,

  • 上传文件时必须提交整个页面,这样页面会被刷新
  • 上传图片是没办法进行图片预览,所以有时候上传错了图片也要等到图片真正上传上去之后刷新了页面才知道。

webuploader解决了这两个问题,webuploader使用ajax技术提交表单,上传的时候不需要提交页面,可以利用事件监听机制监听上传的结果,在页面中做出反馈,而且还能做图片预览。使用webuploader上传图片,也只需要几步:

  • 前台HTML页面配置webuploader
  • 后台服务器PHP页面接受webuploader的上传图片,然后进行处理。
  • 后台处理完图片返回json数据的结果给前台
  • 前台接收后作出反馈。

这里说一点,后台PHP接收和处理图片其实和PHP+HTML表单上传基本是一样的。

三. webuploader的配置和使用

所有的配置参数和使用方法都可以查看官方文件。webuploader官方网站,在webuploader github仓库中有一些example案例可以参考。example

我的运行环境:php5.6+nginx+macOS

我的文件夹的目录

  • index.php
  • upload_img.php
  • mywebupload.js
  • webuploader/
  • uploads/

1. 前台HTML页面配置webupload

主要做以下几个步骤:

  • 引入webuploader的相关js和css包
  • 创建HTML标签
  • 创建一个js文件,初始化webuploader  以下是整个页面代码,webuploader文件夹是在github上整个搬运下来的,然后我还用到了jquery来增强页面的体验。

index.html

<!doctype html>
<html lang="cn">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>WebUploader演示</title>
  <link rel="stylesheet" type="text/css" href="webuploader/css/webuploader.css" />
  <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" />
  <link rel="shortcut icon" href="favicon.ico">
</head>
<body>

  <div id="imgPicker">选择文件</div>
  <button class="btn btn-primary btn-upload">上传</button>
  <div class="img-thumb"></div>
  <div class="result"></div>
  
<!--jquery 1.12-->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!--bootstrap核心js文件-->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
<!--webuploader js-->
<!--<script type="text/javascript" src="static/jquery.js"></script>-->
<script type="text/javascript" src="webuploader/dist/webuploader.min.js"></script>
<script type="text/javascript" src="mywebupload.js"></script>
</body>
</html>

mywebupload.js

$(function(){

  /*
   *  配置webuploader
   */

  var imgUploader = WebUploader.create({
    fileVal: 'img', // 相当于input标签的name属性,用于后台PHP识别接收上传文件的field
    swf: './webuploader/dist/Uploader.swf', // swf文件路径
    server: './upload_img.php', // 文件接收服务端。
    fileNumLimit: 10,  // 上传文件的限制
    pick: {
      id : '#imgPicker',  // 
      multiple : true      // 是否支持多文件上传
    },
    // 只允许上传图片
    accept: {
      title: 'Only Images',
      extensions: 'gif,jpg,jpeg,bmp,png',
      mimeTypes: 'image/jpg,image/jpeg,image/png,image/gif,image/bmp'
    },
    auto: false,  // 添加文件后是否自动上传上去,我设置了false,后面我会利用自己的上传按钮上传
    resize: false  // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
  });
  
  /*
   *  设置上传按钮的单击事件
   */
  $('.btn-upload').click(function(){
    imgUploader.upload();  // webuploader内置的upload函数,启动webuploader的上传  
  });
  
  /*
   *  配置webuploader的事件监听 
   */
  
  // 当图片文件被添加到上传队列中
  imgUploader.on('fileQueued', function (file) {
    addImgThumb(file);
  });
  
  // 生产图片预览
  function addImgThumb(file){
    imgUploader.makeThumb(file, function(error, ret){
      if(!error){
        img = '<img alt="" src="' + ret + '" />';
        $('.img-thumb').append(img);
      }else{
        console.log('making img error');
      }
    },1,1);
  }
  
  imgUploader.on('uploadSuccess'), function(file, response){
    // response 是后台upload_img.php返回的数据
    if(response.success){
      $('.result').append('<p>' + file.name + '上传成功</p>')
    }else{
      $('.result').append('<p>' + response.message + '</p>')
    }
  });
})

2. 后台PHP页面处理上传文件

这里要注意几点:

1 后台处理的php文件文件名必须跟webuploader配置的时候一样。

2 上传的文件夹记得设置好权限,linux可以利用chmod来修改文件夹权限,否则会导致上传失败。

我这里的处理方式比较简单,有什么问题可以给我留言。

upload_img.php

<?php
  $field = 'img';  // 对应webupload里设置的fileVal
  
  $savePath = './uploads/';    // 这里注意设置uploads文件夹的权限
  $saveName = time() . uniqid() . '_' . $_FILES[$field]['name']; // 为文件重命名
  $fullName = $savePath . $saveName; 
  
  if (file_exists($fullName)) {
    $result = [
      'success'=>false, 
      'message'=>'相同文件名的文件已经存在'
    ];
  }else{
    move_uploaded_file($_FILES[$field]["tmp_name"], $fullName);
    $result = ['success'=>true, 'fullName'=>$fullName];
  }
  
  return json_encode($result); // 将结果打包成json格式返回
?>

以上就是webuploader的全部内容,更多webuploader的参数配置和事件可以参考webuploader的官方网址。希望大家多多留言交流指正。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
漂亮但不安全的CTB
Oct 09 PHP
php代码运行时间查看类代码分享
Aug 06 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
php实现四舍五入的方法小结
Mar 03 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
php图片添加文字水印实现代码
Mar 15 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
ThinkPHP中session函数详解
Sep 14 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
php获取微信openid方法总结
Oct 10 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 #PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
May 06 #PHP
PHP实现八皇后算法
May 06 #PHP
Laravel中10个有用的用法小结
May 06 #PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 #PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 #PHP
tp5框架内使用tp3.2分页的方法分析
May 05 #PHP
You might like
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
javascript中使用正则表达式清理table样式的代码
2020/04/01 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
python tornado微信开发入门代码
2018/08/24 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
千元咖啡店的创业计划书范文
2013/12/29 职场文书
教师开学感言
2014/02/14 职场文书
电子工程专业毕业生求职信
2014/03/14 职场文书
房产转让协议书
2014/04/11 职场文书
个人先进事迹材料
2014/12/29 职场文书
第一书记观后感
2015/06/08 职场文书
婚育证明样本
2015/06/16 职场文书
七一表彰大会简报
2015/07/20 职场文书
初中政治教师教学反思
2016/02/23 职场文书