侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例

php  /  管理员 发布于 7年前   174

平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了。后来发现ajaxFileUpload这个插件挺不错,所以就用这个插件来做异步上传文件的效果。网上也有很多对ajaxFileUpload插件的使用的文章,不过我发现没有PHP版,所以这次服务器那边的处理就使用PHP语言来处理。

一、详解ajaxFileUpload插件的语法参数

  原理:ajaxfileupload是通过监听iframe的onload方法来实现, 当从服务端处理完成后,就触发iframe的onload事件调用其绑定的方法,在绑定的方法中获取iframe中服务器返回的数据体(支持的普通文本,json,xml,script, html)

  语法:$.ajaxFileUpload([options])

二、接下来我们看看如何去使用

1、先引入ajaxFileUpload这个插件。

  这里我用的是jq1.11.1版本,网上有说jq版本与ajaxfileupload的版本要对应才不会有异常报错,反正我现在这个没错误。

2、贴上HTML的代码。

 

说明:请上传手持证件的半身照,请确保照片内证件信息清晰可读。

  此处主要的是这一句代码,其他的不用管,因为这里我是在手机端,用的是jqueryMobile插件。

3、到js代码进行处理。

$(document).bind('pageinit', function(){ //照片异步上传 $('#id_photos').change(function(){ //此处用了change事件,当选择好图片打开,关闭窗口时触发此事件 $.ajaxFileUpload({ url:'/uploader/', //处理图片的脚本路径 type: 'post', //提交的方式 secureuri :false, //是否启用安全提交 fileElementId :'id_photos', //file控件ID dataType : 'json', //服务器返回的数据类型  success : function (data, status){ //提交成功后自动执行的处理函数  if(1 != data.total) return;   //因为此处指允许上传单张图片,所以数量如果不是1,那就是有错误了  var url = data.files[0].path;    $('.id_photos').empty();  //此处效果是:当成功上传后会返回一个json数据,里面有url,取出url赋给img标签,然后追加到.id_photos类里显示出图片  $('.id_photos').append('');  //$('.upload-box').remove(); }, error: function(data, status, e){ //提交失败自动执行的处理函数  alert(e); } })});

  这里我对每一行的代码都基本写上了注释方便大家理解。流程就是上传图片给uploader.php去处理,处理成功返回json数据,然后在json中取出url值,将其赋给img标签里,然后将img标签追加带页面显示出来。

  这里我附上json返回的数据:

{ "total": 1, "success": 1, "files": [ {  "srcName": "3.jpg",  "error": 0,  "size": 10715,  "type": "image/jpeg",  "success": true,  "path": "http://m.kellyblog.com/upload/20150528/857f4a35664b4a665e713322306d73b2.0x124x126.jpg",  "width": 124,  "height": 126 } ]}

  上传前HTML页面是这样的:

  异步上传成功后HTML页面效果是这样子的:

  

  4、看看PHP是如何处理的

class UploaderController extends XXXX_Controller { public function index() { $files = array(); $success = 0; //用户统计有多少张图片上传成功了  foreach ($_FILES as $item) {  $index = count($files);  $files[$index]['srcName'] = $item['name']; //上传图片的原名字  $files[$index]['error'] = $item['error']; //和该文件上传相关的错误代码  $files[$index]['size'] = $item['size']; //已上传文件的大小,单位为字节  $files[$index]['type'] = $item['type']; //文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"  $files[$index]['success'] = false;  //这个用于标志该图片是否上传成功  $files[$index]['path'] = '';  //存图片路径  // 接收过程有没有错误  if($item['error'] != 0) continue;  //判断图片能不能上传  if(!is_uploaded_file($item['tmp_name'])) {  $files[$index]['error'] = 8000;  continue;  }  //扩展名  $extension = '';  if(strcmp($item['type'], 'image/jpeg') == 0) {  $extension = '.jpg';  }  else if(strcmp($item['type'], 'image/png') == 0) {  $extension = '.png';  }  else if(strcmp($item['type'], 'image/gif') == 0) {  $extension = '.gif';  }  else {  //如果type不是以上三者,我们就从图片原名称里面去截取判断去取得(处于严谨性)   $substr = strrchr($item['name'], '.');  if(FALSE == $substr) {   $files[$index]['error'] = 8002;   continue;  }  //取得元名字的扩展名后,再通过扩展名去给type赋上对应的值  if(strcasecmp($substr, '.jpg') == 0 || strcasecmp($substr, '.jpeg') == 0 || strcasecmp($substr, '.jfif') == 0 || strcasecmp($substr, '.jpe') == 0 ) {   $files[$index]['type'] = 'image/jpeg';  }  else if(strcasecmp($substr, '.png') == 0) {   $files[$index]['type'] = 'image/png';  }  else if(strcasecmp($substr, '.gif') == 0) {   $files[$index]['type'] = 'image/gif';  }  else {   $files[$index]['error'] = 8003;   continue;  }  $extension = $substr;  }  //对临时文件名加密,用于后面生成复杂的新文件名  $md5 = md5_file($item['tmp_name']);  //取得图片的大小  $imageInfo = getimagesize($item['tmp_name']);  $rawImageWidth = $imageInfo[0];  $rawImageHeight = $imageInfo[1];  //设置图片上传路径,放在upload文件夹,以年月日生成文件夹分类存储,  //rtrim(base_url(), '/')其实就是网站的根目录,大家自己处理  $path = rtrim(base_url(), '/') . '/upload/' . date('Ymd') . '/';  //确保目录可写  ensure_writable_dir($path);  //文件名  $name = "$md5.0x{$rawImageWidth}x{$rawImageHeight}{$extension}";  //加入图片文件没变化到,也就是存在,就不必重复上传了,不存在则上传  $ret = file_exists($path . $name) ? true : move_uploaded_file($item['tmp_name'], $serverPath . $name);  if($ret === false) {  $files[$index]['error'] = 8004;  continue;  }  else {  $files[$index]['path'] = $path . $name; //存图片路径  $files[$index]['success'] = true;  //图片上传成功标志  $files[$index]['width'] = $rawImageWidth; //图片宽度  $files[$index]['height'] = $rawImageHeight; //图片高度  $success ++; //成功+1  } } //将图片已json形式返回给js处理页面 ,这里大家可以改成自己的json返回处理代码 echo json_encode(array(  'total' => count($files),  'success' => $success,  'files' => $files, )); }}/*********************************分割*************************************************///这里我附上ensure_writable_dir()函数的代码/*** 确保文件夹存在并可写** @param string $dir*/function ensure_writable_dir($dir) { if(!file_exists($dir)) { mkdir($dir, 0766, true); chmod($dir, 0766); chmod($dir, 0777); } else if(!is_writable($dir)) { chmod($dir, 0766); chmod($dir, 0777); if(!is_writable($dir)) {  throw new FileSystemException("目录 $dir 不可写"); } }}

代码基本上都加上了注释,方便大家理解,虽然是用PHP处理图片上传,但你理解了上传时程序代码所处理的逻辑思路,将思路用于.net或者java里都还是可以的。 

更多精彩内容请参考专题《ajax上传技术汇总》,《javascript文件上传操作汇总》和《jQuery上传操作汇总》进行学习。

以上就是使用JQuery插件ajaxFileUpload 异步上传文件的整一个分析过程,希望对大家的学习有所帮助。

您可能感兴趣的文章:

  • php+ajax实现图片文件上传功能实例
  • php ajax无刷新上传图片实例代码
  • 使用ajaxfileupload.js实现ajax上传文件php版
  • PHP+jQuery+Ajax实现多图片上传效果
  • php+ajax实现异步上传文件或图片功能
  • php+html5+ajax实现上传图片的方法
  • File, FileReader 和 Ajax 文件上传实例分析(php)
  • PHP+Ajax异步带进度条上传文件实例
  • PHP+Ajax实现上传文件进度条动态显示进度功能
  • php+ajax无刷新上传图片实例代码
  • PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解


  • 上一条:
    PHP获取文件扩展名的4种方法
    下一条:
    PHP如何通过AJAX方式实现登录功能
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客