PHP文件上传进度

时间:2016-11-02 20:09:34

标签: php upload progress

是否有人能够实现此功能?

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

tl; dr是在POST一个包含文件的表单时,如果你包含一个输入" name"将属性设置为php.ini中session.upload_progress.name的值,然后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>

upload.php的

(不重要但显然这是你通常会给文件提供实际名称并将上传的文件从temp移动到真实目录的地方)

<?php

print_r($_FILES);

?>

session.php文件:

在文件上传期间运行此单独的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运行。我一般都尝试过一切。

这很重要,因为我正在使用POST请求与Web服务器上的.php脚本进行通信的桌面应用程序,我没有使用浏览器,因此JS / HTML5解决方案不是图片的一部分。在PHP中编写自己的进度测量功能也是不可能的,因为处理文件上传的脚本(upload.php)实际上并没有运行,直到上传(到具有随机名称的临时目录)完成为止。在上传完成并且上传脚本运行之前,无法找出临时关联的实际文件,从而允许访问$ _FILES。请帮助,我尝试了每一个可能的方法。感谢。

1 个答案:

答案 0 :(得分: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
?>