正如我们所有人都知道的那样,PHP完成了上传,并允许您使用move_uploaded_file()
;然而,在此之前,它会创建一个临时文件,然后完成工作。我想知道是否可以在文件上传期间以及填充到$_FILES
之前获取此上传文件的名称?
我希望获得上传进度,而$_SESSION
和Javascript onprogress
解决方案都很糟糕..
答案 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 >>> ]