文件是否仍在上传?

时间:2009-12-29 04:22:55

标签: ruby file-upload

我正在编写一个应用程序,它将文件放在已通过SFTP上传的特定目录中并将其移至S3。

我有一个问题,我的cron作业在没有完全上传时开始上传文件。我已经想到了尝试等待文件完成的各种方法,但我无法知道(我知道)。

我希望SO的集体天才能够对此有所了解!

3 个答案:

答案 0 :(得分:2)

有很多方法可以解决这个问题:

  1. 更改上传过程以上传数据文件本身(例如,data.txt),然后上传sentinel文件(例如,data.txt.sentinel)。然后在处理数据文件之前等待标记并删除它们。数据文件早于N天,没有相应的标记 - 只需删除它们。只有在您可以更改上传器时才会这样做。

  2. 如果您可以评估文件的内容以检查完整性,这是另一种方法。例如,如果您只上传HTML文件,则可以检查它是否以</html>结尾。除非您可以控制上传的内容,否则并非总是可行。

  3. 未经修改的for-a-while方法。基本上,如果文件没有被修改N分钟,您可以假设上传已经完成。这可能仍会导致处理传输失败的不完整文件。

  4. 所有这些方法都有其优点和缺点,您必须决定哪种方法最适合您。我们尝试选择数字1,我​​们可以影响上传方。

    请记住,N在上述场景中是可配置的。你需要平衡一个太小的N会导致你在选项3中处理一个不完整的文件但是太大的N值会延迟处理所述文件的可能性。

答案 1 :(得分:0)

有什么办法可以在SFTP转移后添加一个步骤吗?我们的想法是将文件SFTP到临时目录,然后一旦完成就有相同的客户端执行(通过SSH)脚本到mv文件到cron作业正在查看的目录。 mv在许多本地Unix文件系统上是原子的,因此cron作业只会看到旧文件或新文件。

当然,如果您可以在SFTP传输后执行脚本,您可以让脚本执行传输到S3,而不使用cron作业;)

答案 2 :(得分:0)

我们使用pure-ftpd进行非常类似的过程。而不是让cron作业执行上传,我们使用pure-ftp的上传脚本选项,每次上传完成时触发脚本。如果ftp服务器可以使用,可以考虑使用类似的机制。