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


Posted in PHP onAugust 17, 2020

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

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

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

语法:$.ajaxFileUpload([options])

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

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

1、先引入ajaxFileUpload这个插件。

<script src="jquery-1.11.1.js" type="text/javascript"></script>
<script src="ajaxfileupload.js" type="text/javascript"></script>

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

2、贴上HTML的代码。

<div data-role="fieldcontain" class="upload-box">
 <label for="id_photos"><span class="red">* </span>您的有效证件照:</label>
  <input type="file" id="id_photos" name="id_photos" value="上传" style="filter:alpha(opacity=10);-moz-opacity:10;opacity:10;" /> 
 <p style="margin-top:0.5em;color:#999;font-size:11pt;">说明:请上传手持证件的半身照,请确保照片内证件信息清晰可读。</p>
 </div>
 <div class="id_photos" >
 
 </div>

此处主要的是<input type="file" id="id_photos" name="id_photos" value="上传">这一句代码,其他的不用管,因为这里我是在手机端,用的是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('<img src="'+url+'" value="'+url+'" style="width:80%" >');
 //$('.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页面是这样的:

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

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

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

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 相关文章推荐
简单的过滤字符串中的HTML标记
Dec 25 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
PHP自定义错误用法示例
Sep 28 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
May 16 PHP
Laravel监听数据库访问,打印SQL的例子
Oct 24 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 #PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 #PHP
php生成4位数字验证码的实现代码
Nov 23 #PHP
3种php生成唯一id的方法
Nov 23 #PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 #PHP
PHP语法小结之基础和变量
Nov 22 #PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 #PHP
You might like
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
js限制文本框的输入内容代码分享(3类)
2015/08/20 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python跳出循环语句continue与break的区别
2014/08/25 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
解决PySide+Python子线程更新UI线程的问题
2019/01/11 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
python主要用于哪些方向
2020/07/05 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
易程科技软件测试笔试
2013/03/24 面试题
日语系毕业生推荐信
2013/11/11 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
审计专业自荐信范文
2014/04/21 职场文书
梅花魂教学反思
2014/04/25 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫