2025年4月26日 星期六 乙巳(蛇)年 正月廿七 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > JavaScript

AJAX文件上传并显示进度条(案例实战)

时间:03-07来源:作者:点击数:54

本例需要 PHP 服务器虚拟环境,同时在站点根目录下新建 upload 文件夹,然后在站点根目录新建前台文件 test1.html,以及后台文件 test.php。在上传文件时,使用 XMLHttpRequest 动态显示文件上传的进度。

test.html

  • <script type="text/javascript">
  • function fileSelected(){
  • var file = document.getElementById('fileToUpload').files[0];
  • if(file){
  • var fileSize = 0;
  • if(file.size>1024*1024){
  • fileSize=(Math.round(file.size*100 / (1024*1024)) / 100).toString()+'MB';
  • } else {
  • fileSize=(Math.round(file.size * 100 / 1024) / 100).toString()+'KB';
  • }
  • document.getElementById('fileName').innerHTML = '文件名:'+ file.name;
  • document.getElementById('fileSize').innerHTML = '大小:'+ fileSize;
  • document.getElementById('fileType').innerHTML = '类型:' + file.type;
  • }
  • }
  • function uploadFile(){
  • var fd = new FormData();
  • fd.append("fileToUpload",document.getElementById('fileToUpload').files[0]);
  • var xhr = new XMLHttpRequest();
  • xhr.upload.addEventListener("progress",uploadProgress,false);
  • xhr.addEventListener("load",uploadComplete,false);
  • xhr.addEventListener("error",uploadFailed,false);
  • xhr.addEventListener("abort",uploadCanceled,false);
  • xhr.open("POST","test.php");
  • xhr.send(fd);
  • }
  • function uploadProgress(evt){
  • if(evt.lengthComputable){
  • var percentComplete = Math.round(evt.loaded * 100 / evt.total);
  • document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';
  • } else {
  • document.getElementById('progressNumber').innerHTML = 'unable to compute';
  • }
  • }
  • function uploadComplete(evt){
  • var info = document.getElementById('info');
  • //当服务器发送响应时,会引发次事件
  • info.innerHTML = evt.target.responseText;
  • }
  • function uploadFailed(evt){
  • console.log("视图上载文件时出现一个错误");
  • }
  • function uploadCanceled(evt){
  • console.log("上传已被用户取消或浏览器放弃连接");
  • }
  • </script>
  • <form id="form1" enctype="multipart/form-data" method="post" action="upload.php">
  • <div class="row">
  • <label for="fileToUpload">选择上传文件</label>
  • <input type="file" name="fileToUpload" id="fileToUpload" onchange="fileSelected()" />
  • </div>
  • <div id="fileName"></div>
  • <div id="fileSize"></div>
  • <div id="fileType"></div>
  • <div class="row">
  • <input type="button" onclick="uploadFile()" value="上传" />
  • </div>
  • <div id="progressNumber"></div>
  • <div id="info"></div>
  • </form>

test.php

  • <?php
  • header("content:text/html; charset=utf-8");
  • $uf = $_FILES['fileToUpload'];
  • if(!$uf){
  • echo '没有 filetoupload 引用';
  • exit();
  • }
  • $upload_file_temp = $uf['tmp_name'];
  • $upload_file_name = $uf['name'];
  • $upload_file_size = $uf['size'];
  • if(!$upload_file_temp){
  • echo "上传失败";
  • exit();
  • }
  • $file_size_max = 1024 * 1024 * 100;
  • //检查文件大小
  • if ($upload_file_size > $file_size_max) {
  • echo "对不起,您的文件容量超出允许范围:".$file_size_max;
  • exit();
  • }
  • $store_dir = "./upload/";
  • $accept_overwrite = 0;
  • $file_path = $store_dir.$upload_file_name;
  • //检查读写文件
  • if (file_exists($file_path) && !$accept_overwrite) {
  • echo "存在相同文件名的文件";
  • exit();
  • }
  • //复制到指定目录
  • if (!move_uploaded_file($upload_file_temp, $file_path) {
  • echo "复制文件失败".$upload_file_temp."to".$file_path;
  • exit();
  • }
  • Echo "<p>您上传了文件:";
  • echo $upload_file_name;
  • echo "<br>";
  • //客户端机器文件的原名称
  • Echo "文件的 MIME 类型为:";
  • echo $uf['type'];
  • //文件的IMIE类型,需要浏览器提供该信息的支持,如image/gif
  • echo "<br>";
  • Echo "上传文件大小";
  • echo $uf['size'];
  • //已上传文件的大小,单位为字节
  • echo "<br>";
  • Echo "文件上传后被临时存储为:";
  • echo $uf['tmp_name'];
  • //文件被上传后在服务器端存储的临时文件名
  • echo "<br>";
  • $error = $uf['error'];
  • switch ($error) {
  • case 0 :
  • Echo "上传成功"; break;
  • case 1 :
  • Echo "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。"; break;
  • case 2 :
  • Echo "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"; break;
  • case 3 :
  • Echo "文件只有部分被上传"; break;
  • case 4 :
  • Echo "没有文件被上传"; break;
  • ?>

演示效果如下: 

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门