PHP+iFrame实现页面无需刷新的异步文件上传


Posted in PHP onSeptember 16, 2014

本文实例讲述了PHP+iFrame实现页面无需刷新的异步文件上传,是非常实用的常见技巧。分享给大家供大家参考。具体分析如下:

说到iframe,现在用它的人是越来越少了,并且很多人都相信它应该被AJAX所取代,的确如此,因为AJAX太出色了。

不过有一种情况的实现我还是选择了iframe,这就是本文要说的文件的异步上传,感兴趣的可以试试,如果用原生的AJAX来实现应该是要复杂的多。

先来给初学者补补基础知识:

1. 在iframe标签一般会指定其name特性以于标识;
2. 在form表单中通过action(目标地址)和target(目标窗口,默认为_self)来确定提交的目的地;
3. 将form中的target指向iframe的name,则可将表单提交到了隐藏框架iframe中;
4. iframe里的内容实际上也是一个页面,其中的js里的parent对象指代父页面,即嵌入iframe的页面;
5. PHP中用move_uploaded_file()函数来实现文件上传,$_FILES数组存储有上传文件的相关信息。

本文实现的是一个用户选择了头像文件后立刻上传并显示在页面上的例子,废话不多说,思路是这样的:

1. 在表单中嵌入一个iframe,设定好name特性值;
2. 在选择文件上传的控件的值改变时触发一个js函数,该函数将表单提交至iframe,而iframe内嵌的页面用来处理文件上传;
3. 在iframe中完成了文件上传之后,在js中通过parent来操作父页面,在特定的标签内显示图片,并将图片的保存地址赋给一个隐藏域;
4. 回到原来的页面,现在既完成了文件的上传,也在隐藏域内记录了文件的路径,整个过程没有刷新页面;
5. 最后用户只需提交原来的页面时重置表单的action和target属性的值即可。

下面是效果截图和实现的代码:

PHP+iFrame实现页面无需刷新的异步文件上传

upload.php页面如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>iFrame异步文件上传</title> 
</head> 
<body> 
<h1>iFrame异步文件上传</h1> 
<form method="post" enctype="multipart/form-data"> 
  用户名: <input type="text" name="username" /><br /> 
  上传头像: <input type="file" name="uploadphoto" onchange="startUpload(this.form)" /> 
  <iframe style="display:none" mce_style="display:none" name="uploadframe"></iframe> 
  <input type="hidden" id="photo" name="photo" value="" /> 
  <div id="displayphoto"></div> 
  <input type="submit" name="submitted" value="提交" onclick="formSubmit(this.form)" /> 
</form> 
<?php  
//页面提交后显示相关信息 
if (isset($_POST['submitted'])) { 
  $html = '<hr /><p>上传成功!</p>'; 
  $html .= '<p>用户名:'.htmlspecialchars($_POST['username']).'</p>'; 
  $html .= '<p>头像地址:'.htmlspecialchars($_POST['photo']).'</p>'; 
  $html .= '<div><img src="'.htmlspecialchars($_POST['photo']).'" mce_src="'.htmlspecialchars($_POST['photo']).'" /></div><hr />'; 
  echo $html; 
} 
?> 
</body> 
</html> 
<mce:script type="text/javascript"><!-- 
//选择了文件后开始异步上传 
function startUpload(oForm) { 
  document.getElementById('displayphoto').innerHTML = 'Loading...'; 
  oForm.action = 'proceedupload.php'; 
  oForm.target = 'uploadframe'; 
  oForm.submit(); 
} 
//整个页面的提交 
function formSubmit(oForm) { 
  oForm.action = document.URL; 
  oForm.target = '_self'; 
  oForm.submit(); 
} 
// --></mce:script>

proceedupload.php页面如下:

<?php 
//这里仅以特定图片格式举例,本应动态获取 
$url = 'upload/img' . time() . '.jpg'; 
if (move_uploaded_file($_FILES['uploadphoto']['tmp_name'], $url)) { 
  //删除之前的图片 
  $_POST['photo'] !== '' && unlink($_POST['photo']); 
?> 
<html> 
<head> 
<body onLoad="doneLoading(parent, '<?=$url?>')"> 
</body> 
</html> 
<mce:script type="text/javascript"><!-- 
//在页面上显示刚刚上传成功的图像 
function doneLoading(theFrame, url) { 
  var oDiv = theFrame.document.getElementById('displayphoto'); 
  oDiv.innerHTML = '<img src="' + url + '" mce_src="' + url + '" alt="上传头像" />'; 
  theFrame.document.getElementById('photo').value = url; 
} 
// --></mce:script> 
<?php 
}
?>

感兴趣的朋友可以测试运行一下本文实例,相信本文所述对大家PHP程序设计的学习有一定的借鉴价值。

PHP 相关文章推荐
第十节--抽象方法和抽象类
Nov 16 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
php生成数组的使用示例 php全组合算法
Jan 16 PHP
php读取3389的脚本
May 06 PHP
php动态绑定变量的用法
Jun 16 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
php数组比较实现查找连续数的方法
Jul 29 PHP
PHP面试题之文件目录操作
Oct 15 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
Mar 21 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
PHP使用静态方法的几个注意事项
Sep 16 #PHP
PHP处理JSON字符串key缺少双引号的解决方法
Sep 16 #PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 #PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
Sep 12 #PHP
php修改指定文件后缀的方法
Sep 11 #PHP
MyEclipse常用配置图文教程
Sep 11 #PHP
Linux下PHP安装mcrypt扩展模块笔记
Sep 10 #PHP
You might like
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
编写简单的Python程序来判断文本的语种
2015/04/07 Python
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
python实现两张图片拼接为一张图片并保存
2019/07/16 Python
Python3离线安装Requests模块问题
2019/10/13 Python
如何在django中运行scrapy框架
2020/04/22 Python
python网络编程之五子棋游戏
2020/05/14 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
ghd官网:英国ghd直发器品牌
2018/05/04 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
安全横幅标语
2014/06/09 职场文书
师德师风事迹材料
2014/12/20 职场文书
Python自动化测试PO模型封装过程详解
2021/06/22 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python