According to the "Useful tips" section (on page 7) of the official specs, you should be able to read the first 11 bytes of the file and match this pattern:
/\xff.\xff...JFIF\x0/
Based on looking at a small number of "*.jpg" files I happen to have uploaded from a camera (via "iPhoto", which may have been involved in "updating" some of those pictures after the upload), I would actually change that to:
/\xff.\xff...(?:JFIF|Exif)\x0/
And apparently, you might expect "JFXX" as well. But frankly, I'd be content to trust the file name, and so would focus on the first reply above.
UPDATE: The above assumes that the file is being read in :raw mode (what we commonly understand as the default behavior of doing binmode FH). Also, I agree with what afoken says below: use a module to validate jpeg files, in case there is any doubt about their validity. | [reply] [d/l] [select] |
But frankly, I'd be content to trust the file name, and so would focus on the first reply above.
This may be a good idea when you can trust the data source, i.e. when you work with your own files. In a network context (CGI, mod_perl, e-mail, ...), relying on meta data (name, MIME type, ...) sent from a foreign computer opens a big security hole. The only safe way to verify a file in that context is to read it and test that it matches the specification. There are several modules on CPAN for that job. For images, Image::Size may be a good strating point.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
| [reply] |
| [reply] |
if ($filename =~ m/\.jpe?g$/i) {
print ("yep, it is a jpg!\n");
}
| [reply] [d/l] |