如何验证jpg文件是否为有效的图像文件。我们正在使用FTP将文件写入目录,但我们似乎在文件写完之前拾取文件,创建无效图像。我需要能够确定何时不再写入。有什么想法吗?
答案 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)使用lsof
或fuser
之类的内容来检查是否有任何内容在您尝试复制之前锁定文件。
答案 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
标志的文件。