2009-07-17 16 views
7

जांचने के लिए $ _FILES के माध्यम से लूपिंग SO, धन्यवाद पर मेरा पहला प्रश्न। :)PHP - फ़ाइल प्रकार

मैं अपनी कंपनी के लिए एक समर्थन समस्या लॉगिंग सिस्टम विकसित कर रहा हूं और इसे फ़ाइलों को अपलोड करने की अनुमति देनी चाहिए और साथ ही हमारे डेटाबेस में सबमिट की गई किसी भी समस्या के रूप में। एक समर्थन समस्या के साथ, 0-6 अलग-अलग अपलोड से जांचने के लिए हो सकता है। मैंने एक छिपी इनपुट फ़ील्ड (imgcount) के माध्यम से कितनी फाइलें प्राप्त की हैं, जो कि जब भी किसी छवि को किसी प्रकार = "फ़ाइल" इनपुट के माध्यम से चुना जाता है, या फ़ॉर्म से हटाया जाता है, तो जेएस के माध्यम से अद्यतन करता है।

मेरा [इनपुट प्रकार = "फ़ाइल"] नाम छवि 1, छवि 2, आदि हैं। जैसा कि मैंने सोचा था कि यह उनके माध्यम से लूप करने के लिए आसान होगा।

जब फॉर्म सबमिट किया गया है तो निम्न कोड यह देखने के लिए एक नज़र डालें कि क्या कोई फाइल है और जांचें कि वे वैध प्रकार (gif/jpeg/png) हैं, इसलिए उन्हें सुरक्षित रूप से अपलोड किया जा सकता है। मैं वायरस के बारे में बहुत चिंतित नहीं हूं क्योंकि समर्थन प्रणाली का एक अच्छा सुरक्षित लॉगऑन है और हम अपने ग्राहकों पर भरोसा करते हैं।

$sscount = $_POST['imgcount']; 
echo $sscount; //to test the variable 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 
     if (($_FILES["image$i"]["type"] == "image/gif") 
     || ($_FILES["image$i"]["type"] == "image/jpeg") 
     || ($_FILES["image$i"]["type"] == "image/png") 
     && ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 
     else 
     { 
     $errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />"; 
     } 
    } 
} 

लेकिन इस के माध्यम से सही ढंग से पाशन जा करने के लिए, किसी को भी किसी भी विचार कैसे मैं लूप करने के लिए इसे पाने के और सही ढंग से लौट सकते हैं मिल गया प्रतीत नहीं होता?

उत्तर

8

& & ऑपरेटर एक उच्च precedence है || से, इसलिए (A OR B OR C) AND D बजाय आपकी इच्छानुसार, यह वास्तव में A OR B OR (C AND D)

है आप इच्छित मूल्यांकन को लागू करने के लिए ब्रांड्स का उपयोग कर सकते हैं।

हालांकि, कुछ इस तरह स्वच्छ और बनाए रखने के लिए आसान हो सकता है/पढ़ें: दूसरों

$allowed_types=array(
    'image/gif', 
    'image/jpeg', 
    'image/png', 
); 


$sscount = $_POST['imgcount']; 
if($sscount>0){ 
    for($i = 1; $i <= $sscount; $i++){ 

     if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
      ($_FILES["image$i"]["size"] < 500000)) 
     { 

     } 

    } 
} 
+0

धन्यवाद पॉल, बहुत सराहना की - मैं अंत में इसके साथ गया। – Stann0rz

+0

अच्छा कोड पॉल। विभिन्न त्रुटि संदेशों के लिए – Josh

2

ठीक है, आपका बुलियन तर्क अस्पष्ट है और संभवतः आप जो भी चाहते हैं वह नहीं कर रहे हैं। यह शायद बेहतर काम करेगा:

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

हालांकि अगर मैं अपने druthers था, पूरे बात दिखाई देगा:

$file = $_FILES['image' . $i]; 
    $type = $file['type']; 
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000) 
+1

यह "संदिग्ध" नहीं है, यह लेखक का इरादा नहीं है। ऑपरेटर प्राथमिकता नियम उस अभिव्यक्ति में किसी भी अस्पष्टता को हल करते हैं। –

+0

मेरी माफ़ी; जिस तरह से मैं "संदिग्ध" का उपयोग कर रहा था अस्पष्ट था। – chaos

+0

ऐसा लगता है कि यह पूरी तरह से काम करता है। 'In_array()' सुझाव के लिए –

0

मुझे लगता है कि अपने if सशर्त गलत है। आप बूलियन्स के पहले समूह के आसपास कोष्ठक कि OR'd कर रहे हैं की जरूरत है, इस तरह:

if ((($_FILES["image$i"]["type"] == "image/gif") 
    || ($_FILES["image$i"]["type"] == "image/jpeg") 
    || ($_FILES["image$i"]["type"] == "image/png")) 
    && ($_FILES["image$i"]["size"] < 500000)) 

यह ठीक से मतलब है "अगर फ़ाइल (gif या jpeg या png) की एक छवि है और है कि आकार से भी कम है" ।

जिस तरह से आप पहले थे, वह संभवतः आपके द्वारा इच्छित तर्क की संभावना नहीं थी।

5

यह आपके प्रश्न का सीधा जवाब नहीं है, लेकिन आप फॉर्म मान को PHP में एक सरणी के रूप में पास कर सकते हैं जो लूप के माध्यम से आसान होना चाहिए। in_array() यह भी जांचने के लिए उपयोगी है कि एक मान एक अनुमत सूची में है।

HTML:

<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 
<input type="file" name="image[]"> 

पीएचपी:

<?php 
if (isset($_FILES['image'])) { 
    foreach ($_FILES['image'] as $file) { 
     if (!in_array($file['type'], array("image/gif", "image/jpeg", "image/png")) 
      || $file['size'] > 500000) { 
      //error 
     } else { 
      //ok 
     } 
    } 
} 
+1

+1। – ceejayoz

+0

मैं दूसरा टॉम हाई का +1 – Josh

4

के रूप में उल्लेख किया है, जिस तरह से आप अपने सशर्त वर्गीकृत किया था गलत था।हालांकि, बस कुछ कोष्ठक जोड़ने के बजाय, मैं सुझाव दूंगा कि आप पूरी तरह से दोनों स्थितियों को अलग कर दें;

// this declaration + the use of in_array() isn't necessary, 
// it just makes things a bit cleaner. 
$file_types = array("image/gif","image/jpeg","image/png"); 

if($_FILES["image$i"]["size"] < 500000) 
{ 
    if(in_array($_FILES["image$i"]["type"], $file_types))) 
    { 
     // do stuff 
    } 
    else 
    { 
     // error about file type 
    } 
} 
else 
{ 
    // error about file size 
} 

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

+1

+1। –

0

आप सभी ['प्रकार'] == x || [ 'प्रकार'] == in_array($_FILES[...]['type'], $allowed)>

$ _FILES को एक कॉल में y [..] [ 'प्रकार'] ग्राहक है कि न तो जाँच की है और न ही php द्वारा स्वच्छ द्वारा भेजे गए डेटा होता है। यदि फ़ाइल का प्रकार किसी भी प्रासंगिकता का है तो $ _FILES [..] ['type'] या $ _FILES [..] ['name'] के प्रत्यय पर भरोसा न करें। केवल वास्तविक सामग्री मायने रखती है। यदि आवश्यक हो तो आप the fileinfo extension या mime_content_type() (जिसे फ़ाइलइन्फो के पक्ष में बहिष्कृत के रूप में चिह्नित किया गया है)

2

मुझे नहीं लगता कि आपको वास्तव में जावास्क्रिप्ट के माध्यम से अद्यतन किया गया एक चर की आवश्यकता है। checking the error code द्वारा कितनी फाइलें अपलोड की गई हैं, यह जानने के लिए आप PHP का उपयोग कर सकते हैं। आप फाइल एक्सटेंशन को चेक करके फ़ाइल अपलोड को भी संभाल सकते हैं, क्योंकि विभिन्न ब्राउज़र अक्सर विभिन्न एमआईएमई प्रकार भेज सकते हैं। यहां एक उदाहरण दिया गया है कि मैं किस बारे में बात कर रहा हूं:

$accepted_files = array(
    'jpg', 
    'png', 
    'gif', 
    'jpeg' 
); 

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    foreach($_FILES as $key => $upload) { 
     if ($upload['error'] == 0) { 
      $file_parts = explode ('.',$upload['name']); 
      if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) { 
       // This type of file is a-ok 
      } 
      else { 
       // Not an accepted file type 
      } 
     } 
    } 
} 
+0

मुझे इस विधि को पसंद है, संकेत के लिए धन्यवाद। मैं निश्चित रूप से इस पर अन्य परियोजना पर इसका उपयोग करूंगा जिस पर मैं काम कर रहा हूं। अनावश्यक जावास्क्रिप्ट का उपयोग न करने के लिए – Stann0rz

+0

+1, कम जटिल समाधान बेहतर है – Josh

संबंधित मुद्दे