2012-03-29 82 views
3

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

+3

简而言之,答案是否定的。漫长的回答是不好的。 – satoshi 2012-03-29 15:56:29

回答

6

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

据我所知,是没有办法(至少横机)说,如果一个文件仍然被上载,没有做这样的事情:

  1. 查询该文件的长度
  2. 等待几秒钟
  3. 查询该文件的长度
  4. 如果是一样的,它可能完成
+0

+1表示逻辑,但即使这是有道理的,检查文件大小的最佳时间段是什么。如果上传器的连接问题可能会在文件上传过程中导致严重延迟,这意味着该文件可能具有相同的大小5,6,10秒或更长时间。如果文件较大,上传速度较慢,则不能很好地解决问题,因为您无法等待几个小时来查看是否完成。 **没有办法**可能是最好的答案。 – Wh1T3h4Ck5 2012-03-29 16:10:57

+0

的确,这就是为什么我提供了一个可行的解决方案,而不是检查文件大小。至少OP可以根据他想做的事情做出决定。 – 2012-03-29 16:12:13

+0

我不会依赖文件大小检查,因为元数据可能被缓存在操作系统中,而临时网络失速会欺骗你的检查。网络连接可能会停顿很多秒,在某些情况下甚至会持续几分钟。 – 2012-03-29 23:41:39

0

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

1

大多数UNIX/Linux/BSD-like操作系统有一个叫做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?

+0

对不起,忘了提及,我在Linux上,并且永远是(不是可移植性的问题)。这听起来很棒!谢谢!明天会尝试。 – 2012-03-29 23:44:18

+0

这个问题是,它计数任何访问文件,上传,下载等我想它可以被更新为仅用于上传,但它取决于如何访问该文件(webdav,ftp,ssh等) – 2012-04-03 11:46:46

+0

嗯,是。但是,您可以使用awk仅显示使用写入或读取/写入文件处理程序打开的文件。这样,阅读不会打扰你。编辑答案... – 2012-04-08 21:06:10

相关问题