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 相关文章推荐
PHP实现多条件查询实例代码
Jul 17 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
Jan 06 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
Apr 25 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
php中的抽象方法和抽象类
Feb 14 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
PHP实现简易计算器功能
Aug 28 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
PHP常用函数之获取汉字首字母功能示例
Oct 21 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 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
php过滤XSS攻击的函数
2013/11/12 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
9个比较实用的php代码片段
2016/03/15 PHP
PHP简单字符串过滤方法示例
2016/09/04 PHP
PHP中非常有用却鲜有人知的函数集锦
2019/08/17 PHP
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
详解tween.js 中文使用指南
2018/01/05 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
浅析vue中的MVVM实现原理
2019/03/04 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Django基于ORM操作数据库的方法详解
2018/03/27 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
品质主管的岗位职责
2013/12/04 职场文书
学校消防演习方案
2014/02/19 职场文书
售后服务承诺书范文
2014/03/26 职场文书
爱护草坪标语
2014/06/24 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python