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 相关文章推荐
php自动适应范围的分页代码
Aug 05 PHP
10个实用的PHP代码片段
Sep 02 PHP
php5.3 注意事项说明
Jul 01 PHP
php实现字符串反转输出的方法
Mar 14 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
php使用for语句输出三角形的方法
Jun 09 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
Laravel解决nesting level错误和隐藏index.php的问题
Oct 12 PHP
详解使用php-cs-fixer格式化代码
Sep 16 PHP
PHP设计模式(观察者模式)
Jul 07 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无限级分类方法及代码
2013/06/21 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
2018/07/18 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
浅谈python函数之作用域(python3.5)
2017/10/27 Python
python获取交互式ssh shell的方法
2019/02/14 Python
浅谈python编译pyc工程--导包问题解决
2019/03/20 Python
Python OS模块实例详解
2019/04/15 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
应用数学自荐书范文
2013/11/24 职场文书
数控技术专科生自我评价
2014/01/08 职场文书
班风学风建设方案
2014/05/06 职场文书
家长建议怎么写
2014/05/15 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
2014年国庆节寄语
2014/09/19 职场文书
公司离职证明范本
2014/10/17 职场文书
2015年财政所工作总结
2015/04/25 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
Python+Tkinter打造签名设计工具
2022/04/01 Python