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程序的方法
Mar 09 PHP
php 正则匹配函数体
Aug 25 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
Jan 23 PHP
php正则preg_replace_callback函数用法实例
Jun 01 PHP
php中实现字符串翻转的方法
Feb 22 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 PHP
php用wangeditor3实现图片上传功能
Aug 22 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
php合并js请求的例子
2013/11/01 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
在Linux系统下一键重新安装WordPress的脚本示例
2015/06/30 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
JavaScript 加号(+)运算符号
2009/12/06 Javascript
javascript跨域刷新实现代码
2011/01/01 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
详解 Python 与文件对象共事的实例
2017/09/11 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
python使用requests.session模拟登录
2019/08/09 Python
Django接收自定义http header过程详解
2019/08/23 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
园长自我鉴定
2013/10/06 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
教师工作能力自我评价
2015/03/04 职场文书
个人承诺书格式范文
2015/04/29 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书