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 中的批处理的实现
Jun 14 PHP
Ping服务的php实现方法,让网站快速被收录
Feb 04 PHP
php 生成唯一id的几种解决方法
Mar 08 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
Zend Framework入门教程之Zend_Config组件用法详解
Dec 09 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 PHP
phpstorm激活码2020附使用详细教程
Sep 25 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
什么是短波收听SWL
2021/03/01 无线电
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
javascript dom 操作详解 js加强
2009/07/13 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
jQuery form 表单验证插件(fieldValue)校验表单
2016/01/24 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
在vue中使用image-webpack-loader实例
2020/11/12 Javascript
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
基于树莓派的语音对话机器人
2019/06/17 Python
python操作kafka实践的示例代码
2019/06/19 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
大学生毕业求职的自我评价
2013/09/29 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
语文教师求职信范文
2015/03/20 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
python使用BeautifulSoup 解析HTML
2022/04/24 Python
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers