2012-06-18 11 views
5

कुछ varaibles सेट करने के लिए मुझे जानकारी चाहिए यदि मेरे सर्वर पर दी गई फ़ाइल एक छवि है। मैं अपने स्थान और नाम के लिए फ़ाइल से संबंधित कुछ भी नहीं जानता।फ़ाइल का पता लगाने के लिए कैसे करें

क्या यह पता लगाने का कोई तरीका है कि कोई फ़ाइल फ़ाइल एक्सटेंशन को देखने के बिना कोई छवि है या नहीं?

+0

मुझे लगता है कि आप छवि के कुछ प्रारूप (.jpg, .png, .gif) का पता लगा सकते हैं, लेकिन सभी मौजूदा प्रारूप नहीं।) क्या यह पर्याप्त होगा? – raina77ow

+0

मेरा प्रश्न फ़ाइल एक्सटेंशन – Thariama

+1

को देखने के बिना समाधान के लिए लक्ष्य बना रहा था, आपको क्या लगता है कि मैंने फ़ाइल एक्सटेंशन के बारे में बात की, फ़ाइल प्रारूपों के बारे में नहीं? – raina77ow

उत्तर

10

ऐसा करने का एक आसान तरीका है 0MCPAN मॉड्यूल के माध्यम से ImageMagick पर काम को प्रस्तुत करना। Identify और Ping विधियों को उस उद्देश्य के लिए डिज़ाइन किया गया है।

use strict; 
use Image::Magick; 

my $im = Image::Magick->new(); 

my ($width, $height, $size, $format) = $im->Ping('/path/to/my/image.jpg'); 

इस छोटे से कार्यक्रम को क्रियान्वित करने के बाद, $format चर छवि के पहचान प्रारूप के साथ एक स्ट्रिंग (इस उदाहरण में: "जेपीईजी") शामिल होंगे (गैर मौजूदा फ़ाइल, या undef गलती की स्थिति में, गैर मान्यता प्राप्त प्रारूप, आदि)।

संपादित करें: ... और पूरी तरह से अपने सवाल का जवाब देने: यह मान लेना कि किसी दिए गए फ़ाइल एक छवि है, तो Ping एक प्रारूप स्ट्रिंग रिटर्न है शायद सुरक्षित है, और अगर यह का हिस्सा जो भी सबसेट आप सफेद करने का फैसला है ImageMagick के list of supported formats (जिसमें गैर-छवि प्रारूप भी शामिल हैं) से सूची।

+0

+1 जो मेरी समस्या को हल कर रहा है - धन्यवाद बहुत अधिक – Thariama

8

जेआरएफर्ग्यूसन ने प्रश्न से जुड़े एक टिप्पणी में file आदेश का उल्लेख किया है। यह सी पुस्तकालय काउंटर-पार्ट, libmagic के साथ आता है। पर्ल बाध्यकारी को File::LibMagic कहा जाता है।

use File::LibMagic qw(); 
my $detect = File::LibMagic->new; 
$detect->checktype_filename("first_success.jpg") =~ /^image/ 

अभिव्यक्ति छवि प्रकारों के लिए सच होती है।

+0

+1 इस अन्य दृष्टिकोण के लिए धन्यवाद – Thariama

+0

+1 मुझे प्रबुद्ध करने के लिए! – JRFerguson

+0

मैंने उपयोग किया एक और तुलनात्मक मॉड्यूल है ['फ़ाइल :: माइमइन्फो :: जादू'] (https://metacpan.org/module/File::MimeInfo::Magic) –

1

आपको पहले से ही दो अच्छे उत्तर मिल गए हैं। इन मामलों में एक और उपकरण है जो मूल्यवान हो सकता है। यह libmagic समाधान से धीमी होने जा रहा है लेकिन यह कभी-कभी अतिरिक्त जानकारी और उपयोगिता के लिए बेहतर होता है। मुझे नहीं पता कि कौन सा उपकरण किनारे के मामलों पर अधिक व्यापक या असफल होने की संभावना है। Image::ExifTool

use Image::ExifTool "ImageInfo"; 

my $info = ImageInfo(shift || die "Give an image file!\n"); 

print "This is a ", $info->{FileType}, "\n"; 

use Data::Dump "pp"; 
print "Here's more...\n"; 
pp $info; 
+0

+1 thx – Thariama

2

आदेश file, के रूप में पहले @JRFerguson से उल्लेख किया है, बनाम File::LibMagic, Image::Magick, या Image::ExifTool सीमाएँ हैं।

लेकिन file बहुत अच्छा है जब आप उन मॉड्यूल को स्थापित या उपयोग नहीं कर सकते हैं। नमूना कोड के लिए, आप कुछ इस तरह के साथ जा सकते हैं:

my $file = "/dir/images/image.jpg"; 
my $type = `file $file`; 

unless ($type =~ /JPEG/i 
    || $type =~ /PNG/i) { 
print "The file is not a valid JPEG or PNG."; 
} 

विचार बस में जाना जाता छवि प्रारूप के खिलाफ regex है।

1

यहां मैंने किया है तरीकों में से एक है। पर्ल मॉड्यूल फॉर्म सीपीएएन "छवि-आकार-3.300> छवि :: आकार" का उपयोग करना। इसमें फ़ाइल विशेषताएँ छवि "प्रकार" भी है। फिर आप इन चरों को ले सकते हैं और अपने आवेदन के लिए कोड को संसाधित करने के लिए जानकारी का उपयोग कर सकते हैं।

#!/usr/bin/perl 

use Image::Size; 

print "Content-type: text/html\n\n"; 

my ($image_width, $image_height, $image_type) = imgsize("path/image.jpg"); 

unless ($image_type =~ /JPG/i 
|| $image_type =~ /PNG/i) { 
print "The file is not a valid JPG or PNG."; 
} 

#To see the results printed to the web browser 
print "<br>(image.jpg) $image_width - $image_height - $image_type<br>\n"; 

exit(0); 
संबंधित मुद्दे