如何获取PHP当前上传文件的临时名称的名称

时间:2014-04-13 07:51:43

标签: php lamp

正如我们所有人都知道的那样,PHP完成了上传,并允许您使用move_uploaded_file();然而,在此之前,它会创建一个临时文件,然后完成工作。我想知道是否可以在文件上传期间以及填充到$_FILES之前获取此上传文件的名称?

我希望获得上传进度,而$_SESSION和Javascript onprogress解决方案都很糟糕..

2 个答案:

答案 0 :(得分:2)

$_FILES['file']['tmp_name'];是文件名。在上传完成之前,PHP(不使用丑陋的技巧)无法获取文件名。

要做到这一点,你必须回退Flash(uploadify)或CGI(Perl / Python / C ++ / Other)

答案 1 :(得分:0)

“可靠”进度条似乎是您的目标,始终需要某种服务器客户端支持。在其最通用和可移植的实例中,PHP只会看到已完成的上传,您将看不到进度条,只有填充的$_FILES结构。

在某些平台上,可以从系统本身获取信息。例如,在Linux / Apache下,您可以检查Apache在/proc伪文件系统中打开的临时文件(如果有);所以你需要加入必需品“Linux,Apache,php5_module,/ proc”。

您可以使用在Web服务器上终止的专用POST端点,但是使用特制的上传程序进程(我在多年前使用Perl脚本工作;我记得它使用了POE和架构):

POST (from browser) ==> (server, proxying) ==> UPLOADER

The uploader immediately echoes a crafted GET to the server, activating
a PHP "pre-upload" page, and then might call a progress GET URL periodically
to update the upload status. When completed, it would issue a pseudo POST
to PHP "almost" as if it came from the client, sending $_POST['_FILES']
instead of $_FILES.

The $_SESSION solution是一个很好的折衷方案,但依赖于服务器不做缓冲。

更好,更“现代”的解决方案是利用分块上传 AJAX技巧,并在一个漂亮的软件包中获得可恢复的上传,可靠的进度和大文件支持。请参阅示例this other answer。现在您获得了更广泛的服务器支持,但该解决方案无法在某些旧版浏览器上运行。

您可以为用户提供旧式FILE上传,Flash上​​传器(绕过所有问题,因为它不依赖于浏览器但是依赖Flash代码),Java FTP上传控制(同样的事情,但有时与一些协议和防火墙问题,因为它不使用HTTP作为容器网页)和AJAX HTML5分块,可能基于浏览器功能。

即,使用IE6的用户会看到一个表单

SORRY!
Your browser does not support large file uploads and progress bar.
To send a file of no more than XXX meg,
[                    ] [Choose file...]  [ >> BEGIN UPLOAD >>> ]