在HTML5中,利用XMLHttpRequest Level 2(XHR2)和FormData对象,我们可以实现文件的异步上传,并且在上传过程中实时显示进度。这个功能对于提高用户体验非常有帮助,特别是处理大文件上传时。以下是一个详细的解释和示例。 HTML部分包含一个表单,用户可以选择一个文件并提交。一个`<div>`用于显示上传进度: ```html <form method="post" id="myForm"> <input type="file" name="file" id="upfile" /> <input type="submit" name="submit" value="提交" /> </form> <div id="upStatus"></div> ``` JavaScript部分是关键,它处理文件选择、创建FormData对象、初始化XMLHttpRequest对象以及处理上传过程中的进度事件: ```javascript var myForm = document.getElementById("myForm"); var upfile = document.getElementById("upfile"); myForm.onsubmit = function() { var fd = new FormData(); var file = upfile.files[0]; fd.append("file", file); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { alert(this.responseText); } }; xhr.open("post", "upfile.php", true); xhr.upload.onprogress = function(ev) { if (ev.lengthComputable) { var percent = Math.round((ev.loaded / ev.total) * 100); document.getElementById("upStatus").innerHTML = percent + "%"; } }; xhr.send(fd); return false; }; ``` 在这个例子中,当用户提交表单时,`onsubmit`事件处理器被触发。它创建一个FormData对象,将用户选择的文件添加到其中,然后创建一个新的XMLHttpRequest对象。`open()`方法用于配置请求类型、URL和是否异步执行。`upload.onprogress`事件监听器负责处理上传进度,如果`lengthComputable`为真,表明可以计算出总进度,然后计算并更新进度条。 服务器端的PHP代码接收上传的文件并将其保存到指定目录: ```php <?php $uploadDir = './upload/'; if (!file_exists($uploadDir)) { @mkdir($uploadDir, 0777, true); } $uploadFile = $uploadDir . basename($_FILES['file']['name']); if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) { echo "OK"; } else { echo "NO"; } ``` 这段代码首先检查上传目录是否存在,如果不存在则创建。然后,使用`move_uploaded_file()`函数将临时文件移动到目标位置。如果成功,返回"OK",否则返回"NO"。 需要注意的是,如果上传文件大小超过PHP的限制,例如默认的8MB,会收到错误提示。可以通过修改`php.ini`中的`post_max_size`和`upload_max_filesize`配置来增大限制。如果不想修改全局配置,也可以在PHP脚本中使用`ini_set()`函数临时调整这些值: ```php ini_set('post_max_size', '100M'); ini_set('upload_max_filesize', '100M'); ``` 以上就是使用PHP和HTML5的XHR2实现文件上传和进度显示的完整流程。这个功能可以帮助用户了解文件上传的状态,提高交互体验。
- 粉丝: 160
- 资源: 978
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助