原生ajax+php上传图片效果
2017-06-19 15:56
211 查看
目的:利用ProgressEvents规范中的进度事件和php相结合实现图片格式的判断及上传。
前提理论:
有以下6个进度事件:
1.loadstart:在接收到响应数据的第一个字节时触发
2.progress:在接收响应期间持续不断地触
3.error:在请求发生错误时触发
4.abort:在因为调用abort()方法而终止连接时触发
5.load:在接收到完整的响应数据时触发
6.loadend:在通信完成或者触发error、abort或load事件后触发
我们先用PHP生成xml文件(注意xml的格式,xml格式要求相对严格,如果有错误则无法获取到xml响应内容),判断图片是否上传成功判断图片类型以及设置图片存放位置。
PHP代码:
JS发送文件内容,在浏览器接收数据期间周期性地触发进度事件。获取响应数据,计算上传速度上传时间。
JS代码:
效果:
![](https://img-blog.csdn.net/20170619161058903?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjY3Njk2Nzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
前提理论:
有以下6个进度事件:
1.loadstart:在接收到响应数据的第一个字节时触发
2.progress:在接收响应期间持续不断地触
3.error:在请求发生错误时触发
4.abort:在因为调用abort()方法而终止连接时触发
5.load:在接收到完整的响应数据时触发
6.loadend:在通信完成或者触发error、abort或load事件后触发
我们先用PHP生成xml文件(注意xml的格式,xml格式要求相对严格,如果有错误则无法获取到xml响应内容),判断图片是否上传成功判断图片类型以及设置图片存放位置。
PHP代码:
<?php $result=uploadImage($_FILES['image']); header('Content-type:text/xml'); echo '<?xml version="1.0" encoding="utf-8" ?>'; echo '<result>'.$result.'</result>'; function uploadImage($file){ //判断是否上传成功 if($file['error']>0){ return '<flag>error</flag><message>php1上传失败</message>'; } //获取上传文件的类型 $type=strchr($file['name'],'.'); if($type!='.jpg'){ return '<flag>error</flag><message>上传失败,只允许jpg扩展名</message>'; } $filename=substr(uniqid(rand()),-6).'.jpg'; //上传文件保存路径 $filepath='./uploads/'.$filename; if(move_uploaded_file($file['tmp_name'],$filepath)){ return '<flag>ok</flag><message>'.$filepath.'</message>'; }else{ return '<flag>error</flag><message>php上传失败</message>'; } } ?>
JS发送文件内容,在浏览器接收数据期间周期性地触发进度事件。获取响应数据,计算上传速度上传时间。
JS代码:
var xhr; var ot; var oloaded; var form=document.getElementById("form"); var progressBar = document.getElementById("progressBar"); var percentageDiv = document.getElementById("percentage"); var contentBar=document.getElementById("content-bar"); //上传文件方法 function UpladFile() { var fileObj = document.getElementById("file").files[0]; // js 获取文件对象 var url = "good.php"; var fd = new FormData(form); // FormData 对象 //form.append("mf", fileObj); // 文件对象 xhr = new XMLHttpRequest(); // XMLHttpRequest 对象 xhr.open("post", url); xhr.onreadystatechange = function() { if(xhr.readyState==4&&xhr.status==200){ console.log(xhr.responseXML); var rptest=xhr.responseXML; var flag=rptest.getElementsByTagName("flag")[0].childNodes[0].nodeValue; var message=rptest.getElementsByTagName("message")[0].childNodes[0].nodeValue; if(flag=="ok"){ var image=document.getElementById("image"); image.src=message; xhr.onload = uploadComplete; //请求完成 contentBar.style.display="block"; } if(flag=="error"){ alert("上传失败,仅上传jpg格式图片"); contentBar.style.display="none"; } } } xhr.upload.onprogress = progressFunction; xhr.upload.onloadstart = function(){ //上传开始执行方法 ot = new Date().getTime(); //设置上传开始时间 oloaded = 0; //设置上传开始时,以上传的文件大小为0 }; xhr.send(fd); } //上传进度实现方法,上传过程中会频繁调用该方法 function progressFunction(evt) { if (evt.lengthComputable) { progressBar.max = evt.total; progressBar.value = evt.loaded; percentageDiv.innerHTML = Math.round(evt.loaded / evt.total * 100) + "%"; } var time = document.getElementById("time"); var nt = new Date().getTime(); //获取当前时间 var pertime = (nt-ot)/1000; ot = new Date().getTime(); //重新赋值时间,用于下次计算 var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位b oloaded = evt.loaded; //上传速度计算 var speed = perload/pertime;//单位b/s var bspeed = speed; var units = 'b/s';//单位名称 if(speed/1024>1){ speed = speed/1024; units = 'k/s'; } if(speed/1024>1){ speed = speed/1024; units = 'M/s'; } speed = speed.toFixed(1); //剩余时间 var resttime = ((evt.total-evt.loaded)/bspeed).toFixed(1); time.innerHTML = ',速度:'+speed+units+',剩余时间:'+resttime+'s'; if(bspeed==0){ time.innerHTML = '上传已取消'; } if(resttime=="0.0"){ contentBar.style.display="none"; } } function uploadComplete(evt) { alert("上传成功!"); } //取消上传 function cancleUploadFile(){ xhr.abort(); }
效果:
相关文章推荐
- PHP+jQuery+Ajax实现多图片上传效果
- 无刷新上传图片 此版本基于原生php,并且会持续更新
- Ajax+PHP实现异步图片上传
- 使用php原生代码上传图片至SAE的STORAGE
- PHP+iframe图片上传实现即时刷新效果
- php原生实现图片上传和查看
- 原生js FileReader对象实现图片上传本地预览效果
- php 图片上传并预览效果
- PHP上传图片增加水印效果
- ajax+php图片上传
- Ajax+PHP 异步上传图片
- php 上传图片 对某一部分模糊处理 实现马赛克遮挡效果(待续)
- PHP图片上传并且加文字水印效果
- 简单图片文字混合上传方案php原生
- 原生javascript FileReader对象实现图片上传本地预览效果
- 前端压缩图片+ajax+php 异步上传
- php:利用插件uploadify完成ajax效果的图片上传
- PHP+jQuery+Ajax实现多图片上传效果
- PHP图片上传加水印
- PHP图片上传加水印(转)