Как я могу проверить файл изображения в Perl? - PullRequest
4 голосов
/ 27 января 2009

Как мне проверить, что файл jpg является допустимым файлом изображения. У нас есть файлы, записанные в каталог с использованием FTP, но мы, похоже, подбираем файл до того, как он закончит запись, создавая недопустимые изображения. Мне нужно иметь возможность определить, когда он больше не записывается. Есть идеи?

Ответы [ 5 ]

4 голосов
/ 27 января 2009

Думаю, вы решаете не ту проблему.

Что вам следует сделать, так это выяснить, как определить, когда какой-либо FTPd, который вы используете, завершает запись файла - таким образом, когда у вас возникает такая же проблема, скажем, для GIF, DOC или MPEG, нужно исправить это снова.

Как именно вы это сделаете, зависит в значительной степени от того, какой FTPd и на какой ОС вы работаете. Некоторые из них, я полагаю, имеют зацепки, которые вы можете установить для запуска после завершения загрузки.

Если вы можете запустить свой собственный FTPd, Net :: FTPServer или POE :: Component :: Server :: FTP можно настроить для правильной работы.

При отсутствии этого:

1) попробуйте переписать логи с помощью Perl-скрипта, который ищет сообщения «загрузка завершена» 2) используйте что-то вроде lsof или fuser, чтобы проверить, блокирует ли что-либо файл, прежде чем пытаться скопировать его.

4 голосов
/ 27 января 2009

Самый простой способ - просто записать файл во временный каталог и затем переместить его в реальный каталог после завершения записи.

Или вы можете проверить здесь .

JPEG :: Ошибка

[arguments: none] Если ссылка на файл остается неопределенной после вызова new, файл должен считаться не разбираемым этим модулем, и следует выдать некоторое сообщение об ошибке и перейти к другому файлу. Сообщение об ошибке, объясняющее причину сбоя, можно получить методом Error:

EDIT:

Image :: TestJPG может быть даже лучше.

1 голос
/ 28 января 2009

Снова глядя на проблему 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
}
0 голосов
/ 27 января 2009

У процесса FTP установлен флаг readonly, затем он работает только с файлами, у которых установлен флаг readonly.

0 голосов
/ 27 января 2009

Однажды у меня было нечто подобное, более или менее то, что я сделал:

var oldImageSize = 0;
var currentImageSize;

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

processImage(imageFile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...