一、什么是onuploadprogress事件
onuploadprogress事件是XMLHttpRequest2中新增的事件,用于在文件上传过程中监测文件上传的进度。
在XMLHttpRequest2之前,我们只能使用onreadystatechange事件来监测文件上传的状态,但是这种方式不能直接获取文件上传的进度信息。
通过使用onuploadprogress事件,我们可以获得以下信息:
loaded: 已上传的字节数 total: 文件总字节数
这些信息可以用来计算文件上传的进度。
二、如何使用onuploadprogress事件
首先,我们需要创建XMLHttpRequest对象:
var xhr = new XMLHttpRequest();
然后,我们需要为xhr对象添加onuploadprogress事件监听器:
xhr.upload.addEventListener("progress", uploadProgress, false);
upload属性表示上传过程中的事件,addEventListner函数用于添加事件监听器。第一个参数为事件名称,第二个参数为事件处理函数,第三个参数为是否在捕获阶段处理事件。
我们需要在事件处理函数中获取已上传的字节数和文件总字节数,并计算上传进度:
function uploadProgress(event) { if (event.lengthComputable) { var percentComplete = event.loaded / event.total; // 计算上传进度,并将结果显示出来 console.log(percentComplete); } else { // 无法计算上传进度 } }
在事件处理函数中,我们首先检查event对象的lengthComputable属性是否为true,如果为true,说明文件总字节数是可计算的,我们就可以计算上传进度。
当事件处理完毕后,我们就可以发送文件上传请求:
xhr.open("POST", "upload.php", true); xhr.send(formData);
其中,"POST"表示请求的方法,"upload.php"表示文件上传的地址,true表示使用异步模式发送请求,formData表示要上传的文件。如果需要上传多个文件,可以使用FormData对象添加多个文件:
var formData = new FormData(); formData.append("file1", file1); formData.append("file2", file2);
三、如何在页面上显示上传进度
我们可以使用HTML5的progress元素来显示文件上传的进度:
<progress id="uploader" value="0"></progress>
我们还需要使用JavaScript更新progress元素的value属性,来显示上传进度:
function uploadProgress(event) { if (event.lengthComputable) { var percentComplete = Math.round(event.loaded / event.total * 100); document.getElementById("uploader").value = percentComplete; } }
在这里,我们将计算出的上传进度乘以100,并使用Math.round函数将结果四舍五入,然后将结果更新到progress元素的value属性中。
四、完整代码示例
HTML:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>文件上传进度监测</title> </head> <body> <form enctype="multipart/form-data" method="post"> <input type="file" name="file1"> <input type="file" name="file2"> <input type="submit" value="上传"> </form> <progress id="uploader" value="0"></progress> <script src="upload.js"></script> </body> </html>
JavaScript:
var xhr = new XMLHttpRequest(); xhr.upload.addEventListener("progress", uploadProgress, false); xhr.open("POST", "upload.php", true); var formData = new FormData(); formData.append("file1", document.getElementsByName("file1")[0].files[0]); formData.append("file2", document.getElementsByName("file2")[0].files[0]); xhr.send(formData); function uploadProgress(event) { if (event.lengthComputable) { var percentComplete = Math.round(event.loaded / event.total * 100); document.getElementById("uploader").value = percentComplete; } }
PHP:
foreach ($_FILES as $file) { move_uploaded_file($file["tmp_name"], "/path/to/uploads/" . $file["name"]); }
在这个PHP脚本中,我们首先使用foreach循环遍历所有上传的文件。然后,我们使用move_uploaded_file函数将上传的文件移动到指定目录下。