Прогресс загрузки файла PHP

Кто-нибудь смог реализовать эту функциональность?

http://php.net/manual/en/session.upload-progress.php

Tl; dr является то, что при разноске формы, содержащей файл, если вы включаете входные данные с атрибутом «name», установленным на значение session.upload_progress.имя в php.ini, затем PHP заполнит $_SESSION данными о состоянии загрузки.

Форма:

<form action="upload.php" method="POST" enctype="multipart/form-data">
 <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
 <input type="file" name="file1" />
 <input type="file" name="file2" />
 <input type="submit" />
</form>

загружать.РНР

(не важно, но очевидно, что именно здесь вы обычно даете файлу его фактическое имя и перемещаете загруженный файл из temp в реальный каталог)

<?php

print_r($_FILES);

?>

сессия.РНР:

Запустите этот отдельный файл PHP во время загрузки файла для проверки прогресса

<?php

$key = ini_get("session.upload_progress.prefix") .  $_POST[ini_get("session.upload_progress.name")];
var_dump($_SESSION[$key]);
?>

Я перепробовал все возможные варианты этих скриптов и php.настройки ini и независимо от того, что массив $_SESSION никогда не заполняется данными загрузки. Session_start () вызывается по умолчанию. Я пытался и в v. 5.4 и 5.6. Я пробовал все, что предлагалось в комментариях в документации PHP, включая работу с FastCGI и без него. Я вообще все перепробовал.

Это важно, потому что я работаю над настольным приложением, которое использует почтовые запросы для связи .php скрипты на веб-сервере, я не использую браузер, так что решения JS / HTML5 не являются частью картины. Также невозможно написать свой собственный прогресс, измеряющий функциональность в PHP, потому что скрипт, который обрабатывает загрузку файла (upload.php) фактически не запускается до завершения загрузки (во временный каталог со случайным именем). Нет способа узнать, с каким фактическим файлом связан временный файл, пока загрузка не будет завершена и не запустится скрипт загрузки, позволяющий получить доступ к $_FILES. Пожалуйста, помогите, я перепробовал все мыслимые возможности. Спасибо.

1 ответ

  1. Форма: / / Выглядит Нормально

        <form action="upload.php" method="POST" enctype="multipart/form-data">
        <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
     <input type="file" name="file1" />
     <input type="file" name="file2" />
     <input type="submit" />
    </form>
    

    Загружать.php / / выглядит нормально

    <?php
    
    print_r($_FILES);
    
    ?>
    

    Сессия.php / / рекомендуем внести некоторые изменения здесь

    <?php
    session_start();//leave this out if you are session is starting automatically
    $key = ini_get("session.upload_progress.prefix") ."123"; //123 value of hidden input
    var_dump($_SESSION[$key]);
    ?>
    

    Основная проблема заключается в том, что в вашей форме html посмотреть их нет ссылки или вызова к сессии.РНР. (мне не нравится именная сессия.php у меня есть эта часть меня, которая боится, что она может вмешаться в $_SESSION scoper). В идеале вы можете(большинство людей) использовать вызов JS/Ajax для запроса сеанса.php для получения результата. В этом случае я бы рекомендовал:

    Форма: (не забудьте импортировать jquery перед этим)

    <form action="upload.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="<?php echo ini_get("session.upload_progress.name"); ?>" value="123" />
    <input type="file" name="file1" />
    <input type="file" name="file2" />
    <input type="submit" />
    </form>
    <script>
    $(document).ready(function(){
      $('form').on('submit',function(){
        $.get( "session.php", function( response ) {
        console.log( response ); // server response-$_SESSION dump
    });
      })
    })
    </script>
    

    сессия.РНР:

    <?php
    session_start();//leave this out if you are session is starting automatically
    $key = ini_get("session.upload_progress.prefix") ."123"; //123 value of hidden input
    var_dump($_SESSION[$key]);//or echo $_SESSION[$key]["bytes_processed"]. I am not sure how the array would playout inside the returned JSON
    ?>