有没有办法检查文件是否使用PHP完全上传?

时间:2012-03-29 15:52:52

标签: php

我在远程机器上有一个目录,我的客户端正在上传(通过不同的工具和协议,从WebDav到FTP)文件。我还有一个返回目录结构的PHP脚本。现在,问题是,如果客户端上传大文件,并且我在上传期间发出请求,PHP脚本将返回该文件,即使它没有完全上传。有没有办法检查文件是否使用PHP完全上传?

3 个答案:

答案 0 :(得分:6)

设置远程服务器以将上传的文件移动到另一个目录,并且只查询目录文件被移动到文件。

AFAIK,没有办法(至少是跨机器)判断文件是否仍在上传,而不执行以下操作:

  1. 查询文件的长度
  2. 等几秒钟
  3. 查询文件的长度
  4. 如果它是相同的,可能已完成

答案 1 :(得分:1)

大多数类似UNIX / Linux / BSD的操作系统都有一个名为lsof的命令(lsof代表“列表打开文件”),它输出系统中所有当前打开文件的列表。您可以运行该命令以查看是否有任何进程仍在使用该文件。如果没有,您的上传已完成。在此示例中,awk用于过滤,因此只显示使用写入或读/写文件处理程序打开的文件:

if (shell_exec("lsof | awk '\$4 ~ /.*[uw]/' | grep " . $uploaded_file_name) == '') {
    /* No file handles open for this file, so upload is finished. */
}

我对Windows服务器不是很熟悉,但是这个帖子可能会帮助你在Windows机器上做同样的事情(如果你有的话):How can I determine whether a specific file is open in Windows?

答案 2 :(得分:0)

我认为某些操作系统在下载文件时会包含“.part”文件,因此可能有办法检查是否存在此类文件。否则,我同意Brian的回答。如果您在同一系统上使用该脚本,那么使用move_uploaded_file()返回它是否足够简单,如果它是由PHP脚本上传的,但它确实成为一个挑战,从可以添加到的远程目录中提取不同的协议。