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

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

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>

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

<?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), фактически не запускается до тех пор, пока загрузка (во временный каталог со случайным именем) не будет завершена. Невозможно выяснить, с каким реальным файлом связан временный файл, пока загрузка не будет завершена и скрипт загрузки не будет запущен, предоставляя доступ к $ _FILES. Пожалуйста, помогите, я перепробовал все возможные варианты. Благодарю.

0

Решение

Форма: // выглядит хорошо

    <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
?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]