Получить байты, переданные с использованием PHP5 для запроса POST

Примечание Я новичок в PHP, Apache и программировании для серверов, поэтому вам будут оценены более подробные объяснения.


Контекст

Я создал - в javascript - индикатор выполнения, отображаемый при загрузке файла. Current У меня есть обновление строки выполнения с установленной частотой кадров (чтобы увидеть, работает ли она).

Ясно, чтобы сделать это точным индикатором выполнения, все должно быть связано с количеством переданных байт по сравнению с общим количеством байтов.

Вопрос

используя PHP5, как я могу получить информацию о количестве байтов, переданных по отношению к общему количеству байтов файла, так что я могу передать это функции JS updateProgress(bytesSoFar, totalBytes), чтобы обновить индикатор выполнения? Пожалуйста, верните мне изменения, необходимые для кода ниже, чтобы заставить это работать. Я видел примеры xhr, но они не полностью доступны.

Я только что настроил LocalHost и использую W3Schools Загрузка файла PHP учебник. Чтобы заставить смоделированную "загрузку" работать, я изменил локальные разрешения, как это предлагается в этом S.O. . Мне не обязательно читать файл, я просто хочу знать, что многие байты были переданы.


Код

В настоящее время у меня есть два файла:

  • index.php

  • upload.php

index.php

<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

</body>
</html>

upload.php

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

Update

Я нашел этот код:

test.php

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_FILES["userfile"])) {



  // move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)
move_uploaded_file($_FILES["userfile"]["tmp_name"], "uploads/" . $_FILES["userfile"]["name"]);
}
?>
<html>
<head>
  <title>File Upload Progress Bar</title>
  <style type="text/css">
    #bar_blank {
    border: solid 1px #000;
    height: 20px;
    width: 300px;
    }

    #bar_color {
    background-color: #006666;
    height: 20px;
    width: 0px;
    }

    #bar_blank, #hidden_iframe {
    display: none;
    }
  </style>
</head>
<body>

  <div id="bar_blank">
    <div id="bar_color"></div>
  </div>
  <div id="status"></div>

  <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST" id="myForm" enctype="multipart/form-data" target="hidden_iframe">
    <input type="hidden" value="myForm" name="<?php echo ini_get("session.upload_progress.name"); ?>">
    <input type="file" name="userfile"><br>
    <input type="submit" value="Start Upload">
  </form>

  <script type="text/javascript">
    function toggleBarVisibility() {
      var e = document.getElementById("bar_blank");
      e.style.display = (e.style.display == "block") ? "none" : "block";
    }

    function createRequestObject() {
      var http;
      if (navigator.appName == "Microsoft Internet Explorer") {
        http = new ActiveXObject("Microsoft.XMLHTTP");
      }
      else {
        http = new XMLHttpRequest();
      }
      return http;
    }

    function sendRequest() {
      var http = createRequestObject();
      http.open("GET", "progress.php");
      http.onreadystatechange = function () { handleResponse(http); };
      http.send(null);
    }

    function handleResponse(http) {
      var response;
      if (http.readyState == 4) {
        response = http.responseText;

        document.getElementById("bar_color").style.width = response + "%";
        document.getElementById("status").innerHTML = response + "%";

        if (response < 100) {
          setTimeout("sendRequest()", 1000);
        }
        else {
          toggleBarVisibility();
          document.getElementById("status").innerHTML = "Done.";
        }
      }
    }

    function startUpload() {
      toggleBarVisibility();
      setTimeout("sendRequest()", 1000);
    }

    (function () {
      document.getElementById("myForm").onsubmit = startUpload;
    })();
  </script>
</body>
</html>

progress.php

session_start();

$key = ini_get("session.upload_progress.prefix") . "myForm";
if (!empty($_SESSION[$key])) {
  $current = $_SESSION[$key]["bytes_processed"];
  $total = $_SESSION[$key]["content_length"];
  echo $current < $total ? ceil($current / $total * 100) : 100;

  $message = ceil($current / $total * 100) : 100;

  $message = "$message"
  echo "<script type='text/javascript'>alert('$message');</script>";
}
else {
  echo 100;
}
?>

Который, как и мой предыдущий код, передает файл. Тем не менее, это не отображает байты до конца (хотя для этого необходимо предупредить), также он открывает новое окно с помощью "Готово". в предыдущем окне.

Ответ 1

Вы можете проверить этот Php File Progress Progress Bar, который может помочь вам начать работу, если вы настаиваете на использовании Php для отображения прогресса. Для получения информации о состоянии загруженного файла используется расширение PECL APC. Можно вычислить количество байтов, полученных сервером, используя ответ apc_fetch() согласно первой ссылке.

Еще один интересный учебник по отслеживанию загрузки, в котором используется собственный php Session Загрузить прогресс.

Наконец, если вы немного открыты для использования Javascript (или библиотеки JS), это будет ideal. Простая в использовании, простая в установке, хорошо известная и поддерживаемая библиотека, о которой я знаю, FineUploader

Ответ 2

Вы можете использовать Функция загрузки сеанса. Он является родным, но требует некоторой конфигурации php.ini.

Пожалуйста, взгляните на руководство по PHP.

ОБНОВЛЕНИЕ 1

Обратите внимание: вам не нужно менять файл upload.php. Вы можете создать новый php файл (например, progress.php) и запросить их для проверки выполнения загрузки с помощью JS.

progress.php

<?php
$upload_id = $_GET['upload_id];
print json_encode($_SESSION['upload_progress_'.$upload_id]);

Затем ваш JS сделает запрос GET на progress.php?upload_id=YourIdValue, и вы получите JSON со всей информацией о ходе.