दिलचस्प पोस्ट
मैं नेस्टेड / रिकर्सिव डिक्शनरी और लिस्ट में deserialize करने के लिए JSON.NET का उपयोग कैसे करूं? Python तर्क का उपयोग करके तालु के लिए कैसे जांचें रेखा के अंत कन्वर्ट पायथन पंडास डेटा को पहचानने में त्रुटि UIWebView के scalesPageToFit के लिए WKWebView समकक्ष कैसे एक git एक हटाए जाने के लिए और एक फ़ाइल चाल के रूप में एक नई फ़ाइल को चिह्नित करने के लिए? सी ++ लूप के लिए – आकार-प्रकार बनाम आकार_टी किसी Windows निष्पादन योग्य में एक JRE एम्बेड करें? सीएसएस मार्जीन गिरने कोनेरीजेएस ड्रॉपडाउन डायरेक्टिव छिपाना जब बाहर क्लिक करते हैं MongoDB और नोडजे के साथ दिनांक डालने और पूछताछ IPhone डिवाइस पर बंडल में निब लोड नहीं किया जा सका मुझे निकास कोड 255 के साथ ibtool क्यों मिल रहा है? कार्य श्रोता जो कि कई बटनों को सुनता है जोड़ने के लिए सी साहचर्य में चल बिन्दु संचालन क्या हैं?

यह निर्धारित करने का सबसे अच्छा तरीका है कि कोई URL PHP में एक छवि है या नहीं

PHP का उपयोग करके, एक यूआरएल दिया जाता है, मैं यह कैसे निर्धारित कर सकता हूं कि यह एक छवि है?

यूआरएल के लिए कोई संदर्भ नहीं है – यह एक सादा पाठ फ़ाइल के मध्य में है, या हो सकता है सिर्फ अपने आप में एक स्ट्रिंग।

मुझे ऊपरी ओवरहेड नहीं चाहिए (उदाहरण के यूआरएल की सामग्री को पढ़ने के लिए) क्योंकि यह पेज पर कई यूआरएल के लिए कहा जा सकता है। इस प्रतिबंध को देखते हुए, यह जरूरी नहीं है कि सभी छवियों की पहचान की जाती है, लेकिन मैं काफी अच्छा अनुमान करना चाहता हूं।

फिलहाल मैं सिर्फ फाइल एक्सटेंशन को देख रहा हूं, लेकिन ऐसा लगता है कि इस से बेहतर तरीका होना चाहिए।

यहां वर्तमान में मेरे पास क्या है:

function isImage( $url ) { $pos = strrpos( $url, "."); if ($pos === false) return false; $ext = strtolower(trim(substr( $url, $pos))); $imgExts = array(".gif", ".jpg", ".jpeg", ".png", ".tiff", ".tif"); // this is far from complete but that's always going to be the case... if ( in_array($ext, $imgExts) ) return true; return false; } 

संपादित करें: यदि यह किसी और के लिए उपयोगी होता है तो एमिल एच के उत्तर से तकनीक का उपयोग करके अंतिम कार्य होता है:

  function isImage($url) { $params = array('http' => array( 'method' => 'HEAD' )); $ctx = stream_context_create($params); $fp = @fopen($url, 'rb', false, $ctx); if (!$fp) return false; // Problem with url $meta = stream_get_meta_data($fp); if ($meta === false) { fclose($fp); return false; // Problem reading data from url } $wrapper_data = $meta["wrapper_data"]; if(is_array($wrapper_data)){ foreach(array_keys($wrapper_data) as $hh){ if (substr($wrapper_data[$hh], 0, 19) == "Content-Type: image") // strlen("Content-Type: image") == 19 { fclose($fp); return true; } } } fclose($fp); return false; } 

Solutions Collecting From Web of "यह निर्धारित करने का सबसे अच्छा तरीका है कि कोई URL PHP में एक छवि है या नहीं"

आप एक HTTP हेड अनुरोध का उपयोग कर सकते हैं और सामग्री प्रकार की जांच कर सकते हैं। यह एक अच्छा समझौता हो सकता है यह PHP स्ट्रीमों का उपयोग करके किया जा सकता है। वीज फ़्यूरॉन्ग में एक लेख है जो दिखाता है कि पोस्ट के अनुरोध भेजने के लिए इस दृष्टिकोण का उपयोग कैसे किया जाए, लेकिन इसे आसानी से HEAD अनुरोध भेजने के लिए अनुकूलित किया जा सकता है। आप stream_get_meta_data () का उपयोग कर एक HTTP प्रतिक्रिया से हेडर पुनः प्राप्त कर सकते हैं।

बेशक यह वास्तव में 100% नहीं है कुछ सर्वर गलत शीर्षलेख भेजते हैं हालांकि ऐसे मामलों को संभाल लेंगे जहां छवियों को एक स्क्रिप्ट के माध्यम से वितरित किया गया है और सही फ़ाइल एक्सटेंशन उपलब्ध नहीं है। वाकई निश्चित रूप से एकमात्र तरीका है कि वास्तव में छवि को पुनः प्राप्त करना – या तो यह सब, या पहले कुछ बाइट्स, जैसा कि थॉमसट्रटर द्वारा सुझाया गया है

कुछ अलग दृष्टिकोण हैं

  • फ़ाइल की शुरुआत में एक जादुई संख्या की खोज करके सामग्री को सूंघें। उदाहरण के लिए, GIF फ़ाइल का पहला पांच बाइट्स (एएससीआई में) के रूप में GIF87 या GIF89 का उपयोग करता है। दुर्भाग्य से यह आपको नहीं बता सकता है कि छवि में कोई त्रुटि है या यदि छवि में दुर्भावनापूर्ण सामग्री है विभिन्न प्रकार की छवि फ़ाइलों के लिए यहां कुछ जादू संख्याएं हैं (इनका उपयोग करने के लिए स्वतंत्र महसूस करें):

     "\ xff \ xd8 \ xff" => 'छवि / जेपीईजी',
     "\ x89PNG \ x0d \ x0a \ x1a \ x0a" => 'चित्र / पीएनजी',
     "II * \ x00" => 'छवि / झगड़ा',
     "एमएम \ x00 *" => 'छवि / झगड़ा',
     "\ x00 \ x00 \ x01 \ x00" => 'छवि / ico',
     "\ x00 \ x00 \ x02 \ x00" => 'छवि / ico',
     "GIF89a" => 'छवि / जीआईएफ',
     "GIF87a" => 'छवि / जीआईएफ',
     "बीएम" => 'छवि / बीएमपी',
    

    इस तरह से सामग्री सूँघने शायद अपनी आवश्यकताओं को सबसे अच्छा फिट करने के लिए जा रहा है; आपको केवल पढ़ना होगा और इसलिए फ़ाइल के पहले कुछ बाइट्स डाउनलोड करें (हेडर पिछले)।

  • जीडी पुस्तकालय का उपयोग करके छवि को लोड करें, यह देखने के लिए कि यह त्रुटि के बिना लोड हो रहा है। यह आपको बता सकता है कि छवि मान्य है या बिना त्रुटि के। दुर्भाग्य से यह शायद आपकी आवश्यकताओं के अनुरूप नहीं है क्योंकि इसकी पूर्ण छवि डाउनलोड करने की आवश्यकता है।

  • अगर आप वास्तव में छवि के लिए एक HTTP अनुरोध नहीं करना चाहते हैं, तो यह दोनों को सूँघने और HTTP हेडर प्राप्त करने का नियम है। हालांकि, यह निर्धारित करने का प्रयास कर सकते हैं कि क्या कुछ संदर्भ द्वारा एक छवि है, जिसमें वह जुड़ा हुआ है। <Img तत्व में एक src विशेषता का प्रयोग करके लिंक कुछ लगभग एक छवि (या XSS पर एक प्रयास है, लेकिन यह एक और कहानी है)। यह आपको बताएगा कि क्या कुछ एक छवि के रूप में करना है यह आपको यह नहीं बताएगा कि छवि वास्तव में उपलब्ध है या मान्य है; आपको यह पता लगाने के लिए छवि यूआरएल के कम से कम पहला छोटा भाग (हैडर या जादू नंबर) लाने की आवश्यकता होगी।

दुर्भाग्य से, एक फ़ाइल दोनों के लिए एक वैध छवि के साथ-साथ एक हानिपूर्ण सामग्री युक्त एक ज़िप फ़ाइल युक्त संभव है जो कि हानिकारक साइट द्वारा जावा के रूप में निष्पादित की जा सकती है – देखें GIFAR का दोहन आप लगभग निश्चित रूप से जीडीए जैसे पुस्तकालय में छवि को लोड करके इस भेद्यता को रोक सकते हैं और उस पर कुछ गैर-तुच्छ फिल्टर कर सकते हैं, जैसे कि इसे एक छोटी राशि नरम करना या तीक्ष्ण करना (यानी एक कन्वल्शन फ़िल्टर का उपयोग करना) और उसे बिना किसी नई फ़ाइल में सहेजना किसी भी मेटाडेटा भर में

यह निर्धारित करने की कोशिश कर रहा है कि क्या कुछ अपनी सामग्री-प्रकार की छवि केवल अकेले अविश्वसनीय है, फ़ाइल एक्सटेंशन की जांच करने के रूप में लगभग अविश्वसनीय है। जब एक <img तत्व का उपयोग करके कोई छवि लोड हो रही है, तो ब्राउज़र जादू की स्ट्रिंग के लिए सूंघ कर देता है।

 if(is_array(getimagesize($urlImg))) echo 'Yes it's an image!'; 

एमिल एच के उत्तर के अलावा:

get_headers() का उपयोग करके get_headers() की सामग्री प्रकार को पूरा फ़ाइल डाउनलोड किए बिना getimagesize()

  $url_headers=get_headers($url, 1); if(isset($url_headers['Content-Type'])){ $type=strtolower($url_headers['Content-Type']); $valid_image_type=array(); $valid_image_type['image/png']=''; $valid_image_type['image/jpg']=''; $valid_image_type['image/jpeg']=''; $valid_image_type['image/jpe']=''; $valid_image_type['image/gif']=''; $valid_image_type['image/tif']=''; $valid_image_type['image/tiff']=''; $valid_image_type['image/svg']=''; $valid_image_type['image/ico']=''; $valid_image_type['image/icon']=''; $valid_image_type['image/x-icon']=''; if(isset($valid_image_type[$type])){ //do something } } 

संपादित करें: लोकप्रिय छवि एक्सटेंशन के साथ स्थिर छवियों के लिए

 <?php $imgExts = array("gif", "jpg", "jpeg", "png", "tiff", "tif"); $url ='path/to/image.png'; $urlExt = pathinfo($url, PATHINFO_EXTENSION); if (in_array($urlExt, $imgExts)) { echo 'Yes, '.$url.' is an Image'; } ?> 

हम छवि प्रकार की जांच करने के लिए exif_imagetype का उपयोग कर सकते हैं, इसलिए यह किसी भी अन्य प्रकार की सामग्री को अनुमति नहीं देता है यह केवल छवियों को अनुमति देता है और हम उन्हें कुछ छवि प्रकारों तक सीमित कर सकते हैं, नमूना कोड के बाद यह दिखाता है कि GIF चित्र प्रकार कैसे अनुमति दें।

 if (exif_imagetype('image.gif') != IMAGETYPE_GIF) { echo 'The picture is not a gif'; } 

आप निम्नलिखित छवि प्रकारों का उपयोग कर सकते हैं,

  IMAGETYPE_GIF IMAGETYPE_JPEG IMAGETYPE_PNG IMAGETYPE_SWF IMAGETYPE_PSD IMAGETYPE_BMP IMAGETYPE_TIFF_II (intel byte order) IMAGETYPE_TIFF_MM (motorola byte order) IMAGETYPE_JPC IMAGETYPE_JP2 IMAGETYPE_JPX IMAGETYPE_JB2 IMAGETYPE_SWC IMAGETYPE_IFF IMAGETYPE_WBMP IMAGETYPE_XBM IMAGETYPE_ICO 

अधिक जानकारी: लिंक

कुछ दिए गए उत्तर के समान, लेकिन थोड़ा अलग तर्क के साथ।

 $headers = @get_headers($url, 1); // @ to suppress errors. Remove when debugging. if (isset($headers['Content-Type'])) { if (strpos($headers['Content-Type'], 'image/') === FALSE) { // Not a regular image (including a 404). } else { // It's an image! } } else { // No 'Content-Type' returned. } 

@ एक त्रुटि नियंत्रण ऑपरेटर है ।

ध्यान दें कि हम "सख्त" ऑपरेटर === FALSE स्थिति में इस्तेमाल करते हैं क्योंकि strpos($headers['Content-Type'], 'image/') हमारे उपयोग के मामले में 0 देता है अगर सुई घास की ढंका में पाया जाता है। == का उपयोग करके टाइप कास्टिंग के साथ गलत तरीके से गलत रूप से व्याख्या की जाएगी

टूट या न मिले चित्रों के लिंक के लिए फास्ट समाधान
मैं आपको सलाह देता हूँ कि getimagesize () का उपयोग न करें क्योंकि यह पहली छवि को डाउनलोड करेगा तो यह छवियों का आकार जांचता है + अगर यह छवि नहीं होगी तो यह अपवाद फेंक देगा, इसलिए नीचे कोड का उपयोग करें

 if(checkRemoteFile($imgurl)) { //found url, its mean echo "this is image"; } function checkRemoteFile($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); // don't download content curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if(curl_exec($ch)!==FALSE) { return true; } else { return false; } } 

नोट: यह वर्तमान कोड टूटा हुआ या नहीं मिली यूआरएल छवि की पहचान करने में आपकी मदद करता है यह आपको छवि प्रकार या हेडर की पहचान करने में मदद नहीं करेगा