php+ajax实现图片文件上传功能实例


Posted in PHP onJune 17, 2014

目前常用的异步文件上传功能有几种,比较多见的如使用iframe框架形式,ajax功能效果,以及flash+php功能,下面介绍ajax与iframe实现异步文件上传的功能的例子。

方法一,利用jquery ajaxfileupload.js实现文件上传

其实就是实现无刷新式的文件上传。可采用IFRAME文件上传原理。
实际上在用PHP上传文件时。。。只能用$_FILES形式,但是若我们只是单一的用JS方式取其ID,如<input id='img' type='file'>..document.getElementById('img').value或者jquery形式的$("#img")都是不能正真实际上传的(但是还是有很多人这样做,刚开始时我也是)。
可是功能上又要要求实现所谓的“异步上传”,怎么办呢?只能借助于第三方的组件,或者自己写一个(在网页里嵌入一个IFRAME)。但如果是考虑开发时间,建议用第三方的,这里有一个不错的jQuery 的Ajax文件上传的组件,即“ajaxfileupload.js",其组件下载地址为://img.jbzj.com/file_images/article/201306/js/ajaxfileupload.js

过程:

(1 )前端文件的代码: test.php

<script type="text/javascript" src="jquery.js"></script> 
 <script type="text/javascript" src="ajaxfileupload.js"></script>
 <script type="text/javascript">
 function ajaxFileUpload()
{
$.ajaxFileUpload
(
  {
 url:'doajaxfileupload.php', //你处理上传文件的服务端
 secureuri:false,
 fileElementId:'img',
 dataType: 'json',
 success: function (data)
 {
alert(data.file_infor);
 }
 }
 )
  return false;
  } 
  </script>
相应的HTML为:
  <input id="img" type="file" size="45" name="img" class="input">
  <button class="button" id="buttonUpload" onclick="return ajaxFileUpload();">Upload</button>

这样客户端就完成了。

(2) 在服务器端的doajaxfileupload.php

此处为了简便的检测是否真正的传值过来了,你可以将它存起来了。

$file_infor = var_export($_FILES,true);
 file_put_contents("d:file_infor.php".$file_infor);

 这样你打来刚生成的file_infor.php文件时,你又看到了熟悉的信息了:

array(
 'name'=>'lamp.jpg',
 'type'=>'image/pjpeg',
 'tmp_name'=>'c:windowstempphpFA.tmp',
 'error'=>0,
 'size'=>3127
)

当然,真正的处理类于这样的:

<?php
  $upFilePath = "d:/";
  $ok=@move_uploaded_file($_FILES['img']['tmp_name'],$upFilePath);
if($ok === FALSE){
 echo json_encode('file_infor'=>'上传失败');
}else{
 echo json_encode('file_infor'=>'上传成功');
}
?>

方法二,利用iframe框架上传图片

html代码如下:

<div class="frm">
  <form name="uploadFrom" id="uploadFrom" action="upload.php" method="post"  target="tarframe" enctype="multipart/form-data">
   <input type="file" id="upload_file" name="upfile">
  </form>
  <iframe src=""  width="0" height="0" style="display:none;" name="tarframe"></iframe>
 </div>
 <div id="msg">
 </div>

index.js文件:

$(function(){
 $("#upload_file").change(function(){
   $("#uploadFrom").submit();
 });
});
function stopSend(str){
 var im="<img src='upload/images/"+str+"'>";
 $("#msg").append(im);
}

upload.php文件:

<?php
 $file=$_FILES['upfile'];
 $name=rand(0,500000).dechex(rand(0,10000)).".jpg";
 move_uploaded_file($file['tmp_name'],"upload/images/".$name);
//调用iframe父窗口的js 函数
 echo "<script>parent.stopSend('$name')</script>";
?>

方法三,原生态ajax文件上传

<!DOCTYPE html>
<html>
<head>
    <title>Html5 Ajax 上传文件</title>
    <meta charset="utf-8">
<script type="text/javascript">
    var xhr;
    function createXMLHttpRequest()
    {
        if(window.ActiveXObject)
        {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        }
        else if(window.XMLHttpRequest)
        {
            xhr = new XMLHttpRequest();
        }
    }
    function UpladFile()
    {
        var fileObj = document.getElementById("file").files[0];
        var FileController = 'upload.php';
        var form = new FormData();
        form.append("myfile", fileObj);
        createXMLHttpRequest();
        xhr.onreadystatechange = handleStateChange;
        xhr.open("post", FileController, true);
        xhr.send(form);
    }
    function handleStateChange()
    {
        if(xhr.readyState == 4)
        {
            if (xhr.status == 200 || xhr.status == 0)
            {
                var result = xhr.responseText;
                var json = eval("(" + result + ")");
                alert('图片链接:n'+json.file);
            }
        }
    }
</script>
<style>
    .txt{ height:28px; border:1px solid #cdcdcd; width:670px;}
    .mybtn{ background-color:#FFF; line-height:14px;vertical-align:middle;border:1px solid #CDCDCD;height:30px; width:70px;}
    .file{ position:absolute; top:0; right:80px; height:24px; filter:alpha(opacity:0);opacity: 0;width:260px }
</style>
</head>
<body>
<div class="form-group">
    <label class="control-label">图片</label>
    <br/>
    <input type='text' name='textfield' id='textfield' class='txt' />
    <span onclick="file.click()"  class="mybtn">浏览...</span>
    <input type="file" name="file" class="file" id="file" size="28" onchange="document.getElementById('textfield').value=this.value" />
    <span onclick="UpladFile()" class="mybtn">上传</span>
</div>
</body>
</html>

php代码:

<?php
if(isset($_FILES["myfile"]))
{
$ret = array();
$uploadDir = 'images'.DIRECTORY_SEPARATOR.date("Ymd").DIRECTORY_SEPARATOR;
$dir = dirname(__FILE__).DIRECTORY_SEPARATOR.$uploadDir;
file_exists($dir) || (mkdir($dir,0777,true) && chmod($dir,0777));
if(!is_array($_FILES["myfile"]["name"])) //single file
{
$fileName = time().uniqid().'.'.pathinfo($_FILES["myfile"]["name"])['extension'];
move_uploaded_file($_FILES["myfile"]["tmp_name"],$dir.$fileName);
$ret['file'] = DIRECTORY_SEPARATOR.$uploadDir.$fileName;
}
echo json_encode($ret);
}
?>
PHP 相关文章推荐
一个显示天气预报的程序
Oct 09 PHP
介绍php设计模式中的工厂模式
Jun 12 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
PHP中批量生成静态html(命令行下运行PHP)
Apr 19 PHP
CodeIgniter分页类pagination使用方法示例
Mar 28 PHP
PHP文件上传类实例详解
Apr 08 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
PHP设计模式之工厂模式详解
Oct 24 PHP
php array_chunk()函数用法与注意事项
Jul 12 PHP
laravel通过a标签从视图向控制器实现传值
Oct 15 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 #PHP
php的SimpleXML方法读写XML接口文件实例解析
Jun 16 #PHP
Thinkphp中Create方法深入探究
Jun 16 #PHP
ThinkPHP中的关联模型注意点
Jun 16 #PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 #PHP
php判断数组元素中是否存在某个字符串的方法
Jun 14 #PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 #PHP
You might like
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
Python获取服务器信息的最简单实现方法
2015/03/05 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
python实现画循环圆
2019/11/23 Python
python随机模块random使用方法详解
2020/02/14 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
python实现按日期归档文件
2021/01/30 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
买房子个人收入证明
2014/01/16 职场文书
一名老师的自我评价
2014/02/07 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
骨干教师培训方案
2014/05/06 职场文书
会计岗位说明书
2014/07/29 职场文书
争做文明公民倡议书
2014/08/29 职场文书
公务员政审个人总结
2015/02/12 职场文书
荒岛余生观后感
2015/06/09 职场文书
初中班主任工作随笔
2015/08/15 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书