php ajax 上传进度条,Ajax progress事件+php实现上传文件显示进度条

废话扯一扯

一直使用jQuery的ajax,对原生ajax也不了解,也没有做过ajax文件上传功能,最近把静态资源CDN换成了又拍云,想实现一下前端上传文件功能,奈何php不是很懂,看又拍云给的文档和demo,做上传进度显示,有不完美的地方,只能又把这个演示demo的文件放在博客的服务器上边,这个功能也是坑了我一下,先进入正题。

API

XMLHttpRequest.upload.progress:获取上传实时进度的事件,这是一个持续触发的事件,也是在这里被狠狠的坑了一把,

new FormData():使用方法先创建一个FormData对象,然后通过调用它的append()方法添加字段,key->value,

// 单文件上传方法

var data = new FormData();

data.append('file', document.querySelector('input[type="file"]').files[0]);

多文件上传方法:file控件添加multiple属性即可选中多个文件,下边为js处理

var aFiles = document.querySelector('#file');

for (var i = 0; i < aFiles.files.length; i++) {

data.append('file['+ i +']', aFiles.files[i]);

}

在控制台打印每个files对象可以获取到文件的一些基本信息,如下图所示:

7bee28cddf970ae02a5b9b5307449143.png

完整demo源码

选择文件:

上传进度条,偷个懒,用progress标签来做:0% complete

实时上传信息:

var oProgress = document.querySelector('progress'),

oRes = document.querySelector('.res'),

oCurrent = document.querySelector('.current-pro'),

oFile = document.querySelector('#file');

var data = new FormData();

oFile.onchange = function() {

oProgress.value = '';

oCurrent.innerHTML = '实时上传信息:';

for (var i = 0; i < oFile.files.length; i++) {

if (oFile.files[i].size / 1024 > 1024) {

alert('请上传小于1024Kb的图片!');

} else

data.append('file['+ i +']', oFile.files[i]);

}

}

document.querySelector('input[type="button"]').onclick = function() {

if (oFile.value == '') {

alert('请选择文件!');

} else

ajax({

url: 'xm_upload.php',

type: 'POST',

dataType: 'json',

data: data,

progress(loaded, total) {

oProgress.value = loaded / total * 100;

oCurrent.innerHTML = '实时上传信息:' + (loaded / total * 100).toFixed(0) + '% ' + loaded + ' Byts; ' + total + ' Byts';

},

success(res) {

oFile.value = '';

res.forEach(function(curr) {

var oImg = new Image();

oImg.src = curr.path;

oRes.appendChild(oImg);

});

},

error(err) {

console.log(err);

}

});

}

header('Content-type:text/json');

date_default_timezone_set("PRC");

for($i = 0; $i < count($_FILES["file"]['name']); $i++){

// 上传文件大小

$fileSize = filesize($_FILES["file"]["tmp_name"][$i]);

// 截取后缀名

$fileEx = strtolower(substr(strrchr($_FILES["file"]["name"][$i], "."), 1));

// 生成随机文件名

$fileName = date("YmdHis") . substr(md5($_FILES["file"]["name"][$i]), 0, 6) . "." . $fileEx;

// 移动文件到指定目录

move_uploaded_file($_FILES["file"]["tmp_name"][$i], "upload/" . $fileName);

// 输出结果

$result[$i] = array(

"name" => urlencode($fileName),

"size" => ceil($fileSize / 1024) . "Kb",

"type" => urlencode($_FILES["file"]["type"][$i]),

"path" => urlencode("upload/" . $fileName),

"code" => 2

);

}

echo urldecode(json_encode($result));

?>

所有文章评论的贴图功能做了拖拽上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Ajax上传文件显示进度条,您可以使用FormData对象和XMLHttpRequest对象。以下是一个简单的示例代码: HTML代码: ``` <form id="file-upload-form"> <input type="file" name="file"> <button type="submit">上传文件</button> </form> <div id="progress-bar"></div> ``` JavaScript代码: ``` var form = document.getElementById('file-upload-form'); var progressBar = document.getElementById('progress-bar'); form.addEventListener('submit', function(e) { e.preventDefault(); var formData = new FormData(this); var xhr = new XMLHttpRequest(); // 监听上传进度 xhr.upload.addEventListener('progress', function(e) { if (e.lengthComputable) { var percentComplete = (e.loaded / e.total) * 100; progressBar.style.width = percentComplete + '%'; } }, false); // 完成上传 xhr.addEventListener('load', function() { progressBar.innerHTML = '上传完成!'; }, false); // 处理上传错误 xhr.addEventListener('error', function() { progressBar.innerHTML = '上传失败。'; }, false); // 发送上传请求 xhr.open('POST', 'upload.php'); xhr.send(formData); }); ``` 在这个示例中,我们首先获取了表单和进度条元素。然后,我们监听了表单的提交事件,阻止了默认的表单提交行为。接着,创建了FormData对象来包含上传的文件数据,并创建了XMLHttpRequest对象。我们给XMLHttpRequest对象添加了一个上传进度事件监听器,当上传进度发生变化时,更新进度条的宽度。接着,我们添加了一个成功上传完成的事件监听器和一个上传错误的监听器。最后,我们打开了一个POST请求,并将FormData对象作为参数发送到服务器。 请注意,这只是一个基本的示例,您需要根据自己的需求进行修改。同时,要确保服务器端也能够处理Ajax上传请求,并返回正确的响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值