Кто-нибудь смог реализовать эту функциональность?
http://php.net/manual/en/session.upload-progress.php
Tl; dr состоит в том, что при отправке формы, содержащей файл, если вы добавляете вход с атрибутом «name», установленным в значение session.upload_progress.name в 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 () вызывается по умолчанию. Я попытался в обоих версиях 5.4 и 5.6. Я пробовал все, что было предложено в комментариях в документации PHP, включая запуск с FastCGI и без него. Я вообще пробовал все.
Это важно, потому что я работаю над настольным приложением, которое использует запросы POST для связи с скриптами .php на веб-сервере, я не пользуюсь браузером, поэтому решения JS / HTML5 не являются частью изображения. Также невозможно написать свои собственные функции измерения прогресса в PHP, потому что скрипт, который обрабатывает загрузку файла (upload.php), фактически не запускается до тех пор, пока загрузка (в каталог temp со случайным именем) не будет завершена. Нет способа узнать, какой фактический файл связан с темпом, пока загрузка не будет завершена, а сценарий загрузки не будет запущен, что позволит получить доступ к $ _FILES. Пожалуйста, помогите, я пробовал каждую доступную возможность. Благодарю.
Форма: // выглядит хорошо
<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>
Upload.php // Смотрит тоже
<?php print_r($_FILES); ?>
Session.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. Просмотр их не является ссылкой или вызовом session.php. (Мне не нравится имя session.php. У меня есть эта часть меня, которая боится, что она может вмешиваться в $ _SESSION scoper). В идеале вы можете (большинство людей) использовать JS / Ajax-вызов для запроса Session.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>
session.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]);//or echo $_SESSION[$key]["bytes_processed"]. I am not sure how the array would playout inside the returned JSON ?>