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 相关文章推荐
帖几个PHP的无限分类实现想法~
Jan 02 PHP
java EJB 加密与解密原理的一个例子
Jan 11 PHP
php 字符串函数收集
Mar 29 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
Sep 27 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
php数组比较实现查找连续数的方法
Jul 29 PHP
php 使用html5实现多文件上传实例
Oct 24 PHP
Yii核心验证器api详解
Nov 23 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
Mar 07 PHP
php桥接模式应用案例分析
Oct 23 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python时间获取及转换知识汇总
2017/01/11 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
详解python中的json和字典dict
2018/06/22 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
Python使用os.listdir和os.walk获取文件路径
2020/05/21 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
NULL是什么,它是怎么定义的
2015/05/09 面试题
初中地理教学反思
2014/01/11 职场文书
研究生导师评语
2014/12/31 职场文书
行政答辩状范文
2015/05/21 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android