php中通过Ajax如何实现异步文件上传的代码实例


Posted in PHP onMay 07, 2011

1:取得file对象
2:读取2进制数据
3:模拟http请求,把数据发送出去(这里通常比较麻烦)
在forefox下使用 xmlhttprequest 对象的 sendasbinary 方法发送数据;
4:完美实现
遇到的问题
目前仅有 firefox 可以正确上传文件。(chrome也可以采google.gears上传)
对于从firefox和chrome下读取到的文件数据好像不一样(不知道是否是调试工具的原因)
chrome以及其他高级浏览器没有 sendasbinary 方法 只能使用 send 方法发送数据,有可能是上面的原因导致无法正确上传。(经过测试普通文本文件可以正确上传)

<!doctype html > 
<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
<title>html5 file and filereader</title> 
<link href="html/ui.css" _mce_href="html/ui.css" rel="stylesheet" /> 
</head> 
<body> 
<style type="text/css"><!-- 
.box{background:#f8f8f8;border:1px solid #ccc;padding:10px;-webkit-box-shadow:#000 0px 0px 4px;-moz-box-shadow:#000 0px 0px 4px; 
-webkit-border-radius:2px;font-family: 'segoe ui', calibri, 'myriad pro', myriad, 'trebuchet ms', helvetica, arial, sans-serif; 
} 
.bl{ font-weight:700;} 
.dl{ padding:10px; border-top:1px dotted #999;} 
.dl dd{ padding:0; margin:0;} 
.log{border:1px solid #ccc; background:#f8f8f8; width:200px; position:absolute; right:10px; top:10px;} 
.log li{border:1p dotted #ccc;word-wrap:break-word;word-break:break-all; margin:0px; padding:0;} 
.log ul{margin:0px; padding:0; list-style:none;} 
--></style><style type="text/css" _mce_bogus="1"><!-- 
.box{background:#f8f8f8;border:1px solid #ccc;padding:10px;-webkit-box-shadow:#000 0px 0px 4px;-moz-box-shadow:#000 0px 0px 4px; 
-webkit-border-radius:2px;font-family: 'segoe ui', calibri, 'myriad pro', myriad, 'trebuchet ms', helvetica, arial, sans-serif; 
} 
.bl{ font-weight:700;} 
.dl{ padding:10px; border-top:1px dotted #999;} 
.dl dd{ padding:0; margin:0;} 
.log{border:1px solid #ccc; background:#f8f8f8; width:200px; position:absolute; right:10px; top:10px;} 
.log li{border:1p dotted #ccc;word-wrap:break-word;word-break:break-all; margin:0px; padding:0;} 
.log ul{margin:0px; padding:0; list-style:none;} 
--></style> 
<div class="box" id="baseinfo"> 
<h2>(把图片拖拽到这里)利用 filereader 获取文件 base64 编码</h2> 
<div></div> 
</div> 
<div class="log"> 
<ul id="log"> 
</ul> 
</div> 
<script type="text/CSS" ><!-- 
(function(){ 
window.datavalue = 0; 
var html = ' <dl class="dl"> 
<dd>filename: $filename$</dd> 
<dd>filetype: $filetype$</dd> 
<dd>filesize: $filesize$</dd> 
<dd><img src="$data$" /></dd> 
<dd>filebase64: <br/> 
<div style="width:100%; height:100px;">$filebase64$</div> 
</dd> 
</dl> 
' 
var log = function(msg){ 
//console['log'](msg); 
document.getelementbyid('log').innerhtml += '<li>'+ msg +'</li>'; 
} 
var dp = function(){ 
var defconfig = { 
dropwrap : window 
} 
this.init.apply(this, [defconfig]); 
this.file = null; 
} 
dp.prototype = { 
init:function(args){ 
var dropwrap = args.dropwrap; 
var _this = this; 
dropwrap.addeventlistener("dragenter", this._dragenter, false); 
dropwrap.addeventlistener("dragover", this._dragover, false); 
dropwrap.addeventlistener('drop', function(e){_this.readfile.call(_this,e)} , false); 
log('window drop bind--ok'); 
}, 
_dragenter:function(e){e.stoppropagation();e.preventdefault();}, 
_dragover:function(e){e.stoppropagation();e.preventdefault();}, 
readfile:function(e){ 
e.stoppropagation(); 
e.preventdefault(); 
var dt = e.datatransfer; 
var files = dt.files; 
for(var i = 0; i< files.length;i++){ 
var html = html.slice(); 
html = this.writeheader(files[i], html); 
this.read(files[i], html); 
} 
}, 
read:function(file, h){ 
var type = file.type; 
var reader = new filereader(); 
reader.onprogress = function(e){ 
if (e.lengthcomputable){ 
log('progress: ' + math.ceil(100*e.loaded/file.size) +'%') 
} 
}; 
reader.onloadstart = function(e){ 
log('onloadstart: ok'); 
}; 
reader.onloadend = function(e){ 
var _result = e.target.result; 
//console['log'](e.target); 
log('data uri--ok'); 
var d = document.createelement('div'); 
h = h.replace('$filebase64$', _result); 
if(/image/.test(file.type)){ 
h = h.replace('$data$',_result); 
} 
d.innerhtml = h; 
document.getelementbyid('baseinfo').appendchild(d); 
}; 
reader.readasdataurl(file); // www.3ppt.com base 64 编码 
return; 
}, 
writeheader:function(file, h){ 
log(file.filename + '+' + (file.size/1024)); 
return h.replace('$filename$', file.filename).replace("$filesize$",(file.size/1024)+'kb').replace("$filetype$",file.type); 
} 
} 
new dp(); 
})() 
// --></script> 
</body> 
</html> 
filereader对象 
var filereader = new filereader(); 
filereader.onloadend = function(){ 
console.log(this.readystate); // 这个时候 应该是 2 
console.log(this.result); 读取完成回调函数,数据保存在result中 
} 
filereader.readasbinarystring(file);// 开始读取2进制数据 异步 参数为file 对象 
//filereader.readasdataurl(file); // 读取base64 
//filereader.readastext(file);//读取文本信息
PHP 相关文章推荐
example2.php
Oct 09 PHP
PHP 远程关机实现代码
Nov 10 PHP
php的sprintf函数的用法 控制浮点数格式
Feb 14 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
PHP中__FILE__、dirname与basename用法实例分析
Dec 01 PHP
ThinkPHP中使用ajax接收json数据的方法
Dec 18 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
PHP页面转UTF-8中文编码乱码的解决办法
Oct 20 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
Yii CDBCriteria常用方法实例小结
Jan 19 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
php 安全过滤函数代码
May 07 #PHP
PHP 遍历文件实现代码
May 04 #PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 #PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 #PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
May 04 #PHP
php join函数应用
May 04 #PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 #PHP
You might like
PHP脚本的10个技巧(2)
2006/10/09 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
Angular路由简单学习
2016/12/26 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
python通过post提交数据的方法
2015/05/06 Python
关于Django外键赋值问题详解
2017/08/13 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Python实现FTP文件传输的实例
2019/07/07 Python
布隆过滤器的概述及Python实现方法
2019/12/08 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
python datetime处理时间小结
2020/04/16 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
高中生的自我鉴定范文
2014/01/24 职场文书
大学毕业感言200字
2014/03/09 职场文书
服装设计专业求职信
2014/06/16 职场文书
员工工作能力评语
2014/12/31 职场文书
储备店长岗位职责
2015/04/14 职场文书
《失物招领》教学反思
2016/02/20 职场文书
如何理解及使用Python闭包
2021/06/01 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL