只抓取已完成的文件

时间:2011-03-29 20:05:58

标签: php

我正在为两个闪存/空中应用程序制作一个真正简单的“后端”(PHP5)。其中一个将上传照片,后端将其保存到文件夹,第二个应用程序将在后端轮询新照片并显示它们。

我没有任何数据库访问权限,所以后端必须是纯PHP5,仅此而已。这就是为什么我选择将图像保存到文件夹(名称中带有时间戳)并使用readdir()来恢复它们的原因。

这一切都像一个魅力。不过,我真的很想确保后端只返回完全上传的照片,防止第二个应用尝试加载未完成的图像。我可以使用任何方法/技巧来验证文件吗?

4 个答案:

答案 0 :(得分:0)

您可以检查文件大小几百毫秒,看看它是否发生了变化:

$first = filesize($file);
// wait 100ms
usleep(100000);
$second = filesize($file);

if($first == $second) {
  // file is no longer being actively uploaded
}

答案 1 :(得分:0)

一种非常简单和常见的方法是根据文件名创建一个触发器文件,这样就可以得到类似

的内容
123.jpg
123.rdy

123.jpg
123.jpg.rdy

上传完成后,您就会创建该文件(只是一个空存根)。抓取文件加载的应用程序只关心具有触发器文件的文件,然后处理这些文件。或者,您也可以将上传的文件保存为ie。 123.bsy123.jpg.bsy正在上传,然后在上传完成后将其重命名为结局名称123.jpg。由于在处理时间方面,在同一目录中重命名通常是非常便宜的操作,因此在竞争条件下运行的可能性应该非常低。 (这可能或现在可能取决于所使用的操作系统,但是......)

如果您需要将文件保存在该位置,您当然可以使用一个数据库,在该数据库中为每个文件添加记录,因为上传已完成。然后,另一个应用程序可以只提供具有匹配数据库记录的文件。

答案 2 :(得分:0)

原子文件系统操作的常用技巧是写入一个与读者不匹配的临时文件(例如XXX.jpg.tmp),一旦完全上传,将其重命名为它的目标名称。在同一卷上重命名是原子的,因此文件没有完整或不可用是没有意义的。

答案 3 :(得分:0)

写下这一切后,我自己搞清楚了。我所做的是在文件名中添加确切的字节数,并在输出图像列表时验证。 .tmp / .bsy-sollution也不错,但我读了一下才推迟:) 我的解决方案的优点是上传完成后不再需要重命名。谢谢大家的快速回答!