如何在Perl中验证图像文件?

时间:2009-01-27 10:02:24

标签: perl image ftp locking

如何验证jpg文件是否为有效的图像文件。我们正在使用FTP将文件写入目录,但我们似乎在文件写完之前拾取文件,创建无效图像。我需要能够确定何时不再写入。有什么想法吗?

5 个答案:

答案 0 :(得分:4)

最简单的方法可能就是将文件写入临时目录,然后在写完成后将其移动到真实目录。

或者您可以查看here

  

JPEG ::错误

     

[arguments:none]如果在调用new之后文件引用仍然未定义,则该模块将认为该文件不可解析,并且应该发出一些错误消息并转到另一个文件。可以使用Error方法检索解释失败原因的错误消息:

编辑:

Image::TestJPG可能会更好。

答案 1 :(得分:4)

我认为你正在解决错误的问题。

你应该做的是弄清楚如何判断你正在使用的FTP是什么时候写完文件 - 那样当你遇到(比如说)GIF,DOC或MPEG时遇到同样的问题时,你不要我必须再次修复它。

确切地说,如何做到这一点,取决于你在运行什么操作系统上的FTPd。我相信有些人可以设置在上传完成时触发的钩子。

如果你可以运行自己的FTPd,可以自定义Net :: FTPServer或POE :: Component :: Server :: FTP来做正确的事情。

如果没有:

1)尝试使用Perl脚本来查找日志,以查找“上传完成”消息 2)使用lsoffuser之类的内容来检查是否有任何内容在您尝试复制之前锁定文件。

答案 2 :(得分:1)

再次查看FTP问题而不是JPG问题。

我检查文件上的时间戳以确保它在最后X(5)分钟内没有被修改 - 这样我可以合理地确定它们已经完成上传

# time in seconds that the file was last modified
my $last_modified = (stat("$path/$file"))[9];

# get the time in secs since epoch (ie 1970) 
my $epoch_time = time();

# ensure file's not been modified during the last 5 mins, ie still uploading
unless ( $last_modified >= ($epoch_time - 300)) {
    # move / edit or what ever
}

答案 3 :(得分:0)

我曾经做过类似的事情,或多或少的事情是:

var oldImageSize = 0;
var currentImageSize;

while((currentImageSize = checkImageSize(imageFile)) != oldImageSize){
    oldImageSize = currentImageSize;
    sleep 10;
}

processImage(imageFile);

答案 4 :(得分:0)

让FTP进程设置readonly标志,然后只处理设置了readonly标志的文件。