php+js iframe实现上传头像界面无跳转


Posted in PHP onApril 29, 2014

上传头像,界面无跳转的方式很多,我用的是加个iframe那种。下面直接上代码。

html:

//route 为后端接口 
//upload/avatar 为上传的头像的保存地址 
//imgurl=/upload/avatar/<?=$uid?> 这里最后的<?=$uid?>是为了后面用js实现即时显示最新的更换后的头像用的,参照下面的js部分的代码 
//头像保存名称为uid.type,如1.jpg,2.png等 
//$user['avatar'] 用户如果上传过头像,该用户数据库中的avatar字段将赋予时间戳,否则为空 
<form target="iframe" enctype="multipart/form-data" action="route?imgurl=/upload/avatar/<?=$uid?>" method="post" id="upload_form"> 
<img class="thumb" src="<?php if($user['avatar']) echo $my_img; else echo '/view/img/100.png'; ?>" style="width:100px; height:100px;" /> 
<input type="file" name="file" size="28" /> 
<input type="submit" name="submit_file" value="确定" style="display: none;"/> 
</form> 
<iframe id="iframe" name="iframe" style="display: none;"></iframe>

php:
$token = param('token'); 
$user = user_from_token($token); 
!$user AND exit("<p class='iframe_message' status='0'>$lang[user_not_exists]</p>"); 
//文件存储路径 
$file_path="./upload/avatar/"; 
//664权限为文件属主和属组用户可读和写,其他用户只读。 
if(is_dir($file_path) != TRUE) mkdir($file_path, 0664) ; 
//定义允许上传的文件扩展名 
$ext_arr = array("gif", "jpg", "jpeg", "png", "bmp"); if (empty($_FILES) === false) { 

//判断检查 

$photo_up_size > 2097152 AND exit("<p class='iframe_message' status='0'>对不起,您上传的照片超过了2M</p>"); 

$_FILES["file"]["error"] > 0 AND exit("<p class='iframe_message' status='0'>文件上传发生错误:".$_FILES["file"]["error"]."</p>"); 

//获得文件扩展名 

$temp_arr = explode(".", $_FILES["file"]["name"]); 

$file_ext = array_pop($temp_arr); 

$file_ext = trim($file_ext); 

$file_ext = strtolower($file_ext); 

//检查扩展名 

if (in_array($file_ext, $ext_arr) === false) { 


exit("<p class='iframe_message' status='0'>上传文件扩展名是不允许的扩展名</p>"); 

} 

//删除目录下相同前缀的文件 

if($dh = opendir($file_path)) { 


while(($file = readdir($dh)) !== false) { 



$file_arr = $file.split('.'); 



if($file_arr[0] == $user['uid']) unlink($file_path.$file); 


} 

} 

//以uid重命名文件 

$new_name = $user['uid'].".".$file_ext; 

//将文件移动到存储目录下 

move_uploaded_file($_FILES["file"]["tmp_name"], $file_path.$new_name); 

//裁剪压缩图片 

clip($file_path.$new_name, $file_path.$new_name, 0, 0, 100, 100); 

clip_thumb($file_path.$new_name, $file_path.$new_name, 100, 100); 

//向数据表写入文件存储信息以便管理 

user_update($user['uid'], array('avatar'=>time())); 

exit("<p class='iframe_message' status='1'>文件上传成功</p>"); 
} else { 

exit("<p class='iframe_message' status='0'>无正确的文件上传</p>"); 
} 
<?php 
function ext($filename) { 
return strtolower(substr(strrchr($filename, '.'), 1)); 
} 
/* 
实例: 
thumb(APP_PATH.'xxx.jpg', APP_PATH.'xxx_thumb.jpg', 200, 200); 
返回: 
array('filesize'=>0, 'width'=>0, 'height'=>0) 
*/ 
function thumb($sourcefile, $destfile, $forcedwidth = 80, $forcedheight = 80) { 
$return = array('filesize'=>0, 'width'=>0, 'height'=>0); 
$imgcomp = 10; 
$destext = ext($destfile); 
if(!in_array($destext, array('gif', 'jpg', 'bmp', 'png'))) { 
return $return; 
} 
$imgcomp = 100 - $imgcomp; 
$imginfo = getimagesize($sourcefile); 
$src_width = $imginfo[0]; 
$src_height = $imginfo[1]; 
if($src_width == 0 || $src_height == 0) { 
return $return; 
} 
$src_scale = $src_width / $src_height; 
$des_scale = $forcedwidth / $forcedheight; 
if(!function_exists('imagecreatefromjpeg')) { 
copy($sourcefile, $destfile); 
$return = array('filesize'=>filesize($destfile), 'width'=>$src_width, 'height'=>$src_height); 
return $return; 
} 
// 按规定比例缩略 
if($src_width <= $forcedwidth && $src_height <= $forcedheight) { 
$des_width = $src_width; 
$des_height = $src_height; 
} elseif($src_scale >= $des_scale) { 
$des_width = ($src_width >= $forcedwidth) ? $forcedwidth : $src_width; 
$des_height = $des_width / $src_scale; 
$des_height = ($des_height >= $forcedheight) ? $forcedheight : $des_height; 
} else { 
$des_height = ($src_height >= $forcedheight) ? $forcedheight : $src_height; 
$des_width = $des_height * $src_scale; 
$des_width = ($des_width >= $forcedwidth) ? $forcedwidth : $des_width; 
} 
switch ($imginfo['mime']) { 
case 'image/jpeg': 
$img_src = imagecreatefromjpeg($sourcefile); 
!$img_src && $img_src = imagecreatefromgif($sourcefile); 
break; 
case 'image/gif': 
$img_src = imagecreatefromgif($sourcefile); 
!$img_src && $img_src = imagecreatefromjpeg($sourcefile); 
break; 
case 'image/png': 
$img_src = imagecreatefrompng($sourcefile); 
break; 
case 'image/wbmp': 
$img_src = imagecreatefromwbmp($sourcefile); 
break; 
default : 
return $return; 
} 
$img_dst = imagecreatetruecolor($des_width, $des_height); 
$img_color = imagecolorallocate($img_dst, 255, 255, 255); 
imagefill($img_dst, 0, 0 ,$img_color); 
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $des_width, $des_height, $src_width, $src_height); 
//$tmpfile = $temp_path.md5($destfile); 
$tmpfile = $destfile; 
switch($destext) { 
case 'jpg': imagejpeg($img_dst, $tmpfile, $imgcomp); break; 
case 'gif': imagegif($img_dst, $tmpfile, $imgcomp); break; 
case 'png': imagepng($img_dst, $tmpfile, version_compare(PHP_VERSION, '5.1.2') == 1 ? 7 : 70); break; 
} 
$r = array('filesize'=>filesize($tmpfile), 'width'=>$des_width, 'height'=>$des_height);; 
copy($tmpfile, $destfile); 
//unlink($tmpfile); 
imagedestroy($img_dst); 
return $r; 
} 
/* 
* 图片裁切 
* 
* @param string $srcname 原图片路径(绝对路径/*.jpg) 
* @param string $forcedheight 裁切后生成新名称(绝对路径/rename.jpg) 
* @param int $sourcefile 被裁切图片的X坐标 
* @param int $destfile 被裁切图片的Y坐标 
* @param int $destext 被裁区域的宽度 
* @param int $imgcomp 被裁区域的高度 
clip('xxx/x.jpg', 'xxx/newx.jpg', 10, 40, 150, 150) 
*/ 
function clip($sourcefile, $destfile, $clipx, $clipy, $clipwidth, $clipheight) { 
$getimgsize = getimagesize($sourcefile); 
if(empty($getimgsize)) { 
return 0; 
} else { 
$imgwidth = $getimgsize[0]; 
$imgheight = $getimgsize[1]; 
if($imgwidth == 0 || $imgheight == 0) { 
return 0; 
} 
} 
if(!function_exists('imagecreatefromjpeg')) { 
copy($sourcefile, $destfile); 
return filesize($destfile); 
} 
switch($getimgsize[2]) { 
case 1 : 
$imgcolor = imagecreatefromgif($sourcefile); 
break; 
case 2 : 
$imgcolor = imagecreatefromjpeg($sourcefile); 
break; 
case 3 : 
$imgcolor = imagecreatefrompng($sourcefile); 
break; 
} 
//$imgcolor = imagecreatefromjpeg($sourcefile); 
$img_dst = imagecreatetruecolor($clipwidth, $clipheight); 
$img_color = imagecolorallocate($img_dst, 255, 255, 255); 
imagefill($img_dst, 0, 0, $img_color); 
imagecopyresampled($img_dst, $imgcolor, 0, 0, $clipx, $clipy, $imgwidth, $imgheight, $imgwidth, $imgheight); 
$tmpfile = $destfile; 
imagejpeg($img_dst, $tmpfile, 100); 
$n = filesize($tmpfile); 
copy($tmpfile, $destfile); 
return $n; 
} 
// 先裁切后缩略,因为确定了,width, height, 不需要返回宽高。 
function clip_thumb($sourcefile, $destfile, $forcedwidth = 80, $forcedheight = 80) { 
// 获取原图片宽高 
$getimgsize = getimagesize($sourcefile); 
if(empty($getimgsize)) { 
return 0; 
} else { 
$src_width = $getimgsize[0]; 
$src_height = $getimgsize[1]; 
if($src_width == 0 || $src_height == 0) { 
return 0; 
} 
} 
$src_scale = $src_width / $src_height; 
$des_scale = $forcedwidth / $forcedheight; 
if($src_width <= $forcedwidth && $src_height <= $forcedheight) { 
$des_width = $src_width; 
$des_height = $src_height; 
$n = clip($sourcefile, $destfile, 0, 0, $des_width, $des_height); 
return filesize($destfile); 
// 原图为横着的矩形 
} elseif($src_scale >= $des_scale) { 
// 以原图的高度作为标准,进行缩略 
$des_height = $src_height; 
$des_width = $src_height / $des_scale; 
$n = clip($sourcefile, $destfile, 0, 0, $des_width, $des_height); 
if($n <= 0) return 0; 
$r = thumb($destfile, $destfile, $forcedwidth, $forcedheight); 
return $r['filesize']; 
// 原图为竖着的矩形 
} else { 
// 以原图的宽度作为标准,进行缩略 
$des_width = $src_width; 
$des_height = $src_width / $des_scale; 
$n = clip($sourcefile, $destfile, 0, 0, $des_width, $des_height); 
if($n <= 0) return 0; 
$r = thumb($destfile, $destfile, $forcedwidth, $forcedheight); 
return $r['filesize']; 
} 
} 
?>

我们php中设置返回内容,会发现,在出现相应情况后,返回内容出现在页面的iframe中,所以我们设定了相应的class,以便前端获得返回内容,做出相应处理。clip(),clip_thumb()为裁剪图片函数,可压缩图片大小,裁取图片以左上角为起点,长宽为100的正方形。

js:

var jsubmit_file = jinput.filter('[name="submit_file"]'); 
var jfile = jinput.filter('[name="file"]'); 
var jiframe = $('#iframe'); 
var jthumb = $('.thumb'); 
var type = ''; 
jfile.on('change', function() { 
var path = jfile.val(); 
var file_arr = path.split('.'); 
type = file_arr[file_arr.length-1]; 
jsubmit_file.trigger('click'); 
}); 
jiframe.on('load', function() { 
var jiframe_message = $(window.frames['iframe'].document).find('.iframe_message'); 
if(jiframe_message.attr('status') != 0) { 
var url = this.contentWindow.location.href; 
var url_arr = url.split('='); 
jthumb.attr('src', url_arr[1] + '.' + type); 
} 
alert(jiframe_message.text()); 
});

这样基本就实现了图片上传、上传结果提示、即时显示上传的最新头像这几个功能,网上有各种插件,虽然功能丰富,就是体积太大,这个看我们取舍了。
PHP 相关文章推荐
php将会员数据导入到ucenter的代码
Jul 18 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
PHP中对用户身份认证实现两种方法
Jun 04 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
Jun 20 PHP
ThinkPHP验证码使用简明教程
Mar 05 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
一张表搞清楚php is_null、empty、isset的区别
Jul 07 PHP
win7安装php框架Yii的方法
Jan 25 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 #PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
Apr 29 #PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
Apr 29 #PHP
PHP include任意文件或URL介绍
Apr 29 #PHP
php调用google接口生成二维码示例
Apr 28 #PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 #PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 #PHP
You might like
杏林同学录(八)
2006/10/09 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
实例介绍PHP中zip_open()函数用法
2019/02/15 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
JavaScript学习笔记之获取当前目录的实现代码
2010/12/14 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
layui的表单提交以及验证和修改弹框的实例
2019/09/09 Javascript
python实现linux下使用xcopy的方法
2015/06/28 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Python常见反爬虫机制解决方案
2020/06/01 Python
详解Python多线程下的list
2020/07/03 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
办公室前台的岗位职责
2013/12/20 职场文书
高中学校对照检查材料
2014/08/31 职场文书
小学运动会加油词
2015/07/18 职场文书
小学运动会通讯稿
2015/07/18 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
在python中读取和写入CSV文件详情
2022/06/28 Python