2010-09-20 14 views
6

मेरे पास एक PHP अनुप्रयोग है।PHP: अपलोड किए गए फ़ाइल नामों को कैसे व्यवस्थित करें?

मैं उपयोगकर्ताओं को अपने वेब एप्लिकेशन में फ़ाइलों को अपलोड करने की अनुमति देता हूं।

प्रश्न: मेरे लिए सबसे अच्छा तरीका अपलोड किए गए दस्तावेज़ PHP में $_FILES["filename"]["tmp_name"] की फ़ाइल नाम को साफ़ करने में क्या है?

अद्यतन:

मैं अपलोड की गई फ़ाइल नाम का एक MD5 लेने के लिए और है कि हाल में सौंपा फ़ाइल नाम के रूप में उपयोग कर सकते हैं? यदि हां, तो मैं PHP में ऐसा कैसे करूं?

+0

क्या आप 'sanitize' की स्पष्ट परिभाषा दे सकते हैं? MySQL के लिए के रूप में? एक यूआरएल? – fredley

+0

मैं अपने वेब सर्वर पर फाइल अपलोड कर रहा हूं। फाइलें छवियां, दस्तावेज इत्यादि हो सकती हैं। मुझे फाइलनाम टकराव नहीं चाहिए।और मैं नहीं चाहता कि लोग फ़ाइल नाम अपलोड करने का प्रयास करें जो मेरे फाइल सिस्टम पर अस्वीकार हो सकता है। – frooyo

+0

आपको यह भी पता होना चाहिए कि आप किस प्रकार की फाइलें अपलोड करने की अनुमति देते हैं। आप नहीं चाहते हैं कि कोई व्यक्ति HTML/जावास्क्रिप्ट फ़ाइलों जैसी चीज़ों को अपलोड करने में सक्षम हो। – Moses

उत्तर

2

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

यदि आप थोड़ा आगे जाना चाहते हैं, तो आप यह सुनिश्चित करने के लिए जादू माइम एक्सटेंशन का उपयोग कर सकते हैं कि फ़ाइल एक ही प्रारूप है जो एक्सटेंशन कहता है।

संपादित करें: किसी निर्देशिका में फ़ाइल नाम टकराव से बचने के लिए, आप फ़ाइल नाम पर आईपी + वर्तमान समय के एमडी 5 जोड़ सकते हैं।

+0

क्या होता है यदि वे एक ही समय में 2 दस्तावेज़ अपलोड करते हैं? – frooyo

+0

कुछ अतिरिक्त एंट्रॉपी जोड़ें, प्रत्येक फाइल के लिए एक काउंटर का उपयोग करें: –

+0

यदि आपके द्वारा प्रक्रिया की जाने वाली प्रत्येक फ़ाइल के लिए $ i बढ़ाया गया है: '$ filename = $ sanitizedFileName। एमडी 5 ($ _ सर्वर ["REMOTE_ADDR"]। समय()। $ i)। $ एक्सटेंशन; ' –

-2

यदि आप वास्तविक फ़ाइल नाम खोने के खिलाफ नहीं हैं, तो मैं आमतौर पर फ़ाइल नाम का हैश बना देता हूं और फ़ाइल नाम सेट करता हूं, यदि आप जो कुछ भी विकसित कर रहे हैं, उसके पास अपलोड किए जा रहे चित्रों का भार है, तो यह उन संघर्षों से बचने में मदद करता है जहां दो फ़ाइल नामों को समान रूप से नामित किया जाता है और ओवरराइट होते हैं।

hash('md5', $_FILES["filename"]["tmp_name"]); 
+0

क्या आपका मतलब है: ** हैश ('md5', $ _FILES [" filename "] [" tmp_name "]) **? – frooyo

+0

हां, आपके द्वारा पारित पहला तर्क हैश का प्रकार है जिसे आप बनाना चाहते हैं और दूसरा तर्क वह स्ट्रिंग है जिसे आप हैश बनाना चाहते हैं। PHP हैश - http://www.php.net/manual/en/function.hash.php – jduren

+0

मैं सैम डेज़ अभ्यास को जोड़ने का भी सुझाव दूंगा, जहां आप हैशिंग से पहले फ़ाइल नाम में वर्तमान समय जोड़ सकते हैं, जो एक यहां तक ​​कि अधिक अद्वितीय फ़ाइल नाम। – jduren

3

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

4

फ़ाइल नाम विरोध सिर्फ जाँच करें कि क्या दिया जाता है या उत्पन्न फ़ाइल नाम पहले से ही नहीं है मौजूद है से बचने के लिए:

do { 
    // Generate filename, eg.: 
    $filename = md5(uniqid()) . $fileExtension; 
} while (file_exists($filename)); 

है कि आप 100% यकीन है कि फ़ाइल नाम अद्वितीय है देता है। एमडी 5 (या किसी अन्य हैश एल्गोरिदम) का उपयोग करके आप सुनिश्चित करते हैं कि फ़ाइल नाम सुरक्षित है - और इसे संभालना आसान है।

+2

यह कोई मतलब नहीं है। आप uniqid फ़ंक्शन का MD5 ले रहे हैं। क्यूं कर? – frooyo

+0

यह एकमात्र उदाहरण है। आप मूल फ़ाइल नाम आदि का उपयोग कर सकते हैं। बिंदु यह है कि आपको लूप में जांच करनी चाहिए कि जेनरेट किया गया फ़ाइल नाम पहले से उपयोग में है या नहीं। यदि फ़ाइल नाम पुनर्जीवित करें। – Crozin

+3

uniqid() के md5() लेना कोई समझ नहीं आता है। एक लूप में मूल फ़ाइल नाम (यानी निरंतर मान) के md5() को लेना भी कम समझ में आता है। :-) – Cucu

0

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

move_uploaded_file($_FILES["tmp_name"],"/home/yourname/".$user_id));

फिर आप सिर्फ उपयोगकर्ता की आईडी जानने से किसी भी स्थान से छवि (जैसे कि, एस 3 या यहां तक ​​कि अपने खुद के सर्वर) प्राप्त कर सके। छवि यूआरएल स्टोर करने के लिए आपको अपने डेटाबेस में एक विशेषता की भी आवश्यकता नहीं है।

0

सीओओ, यह फ़ंक्शन सभी बिंदुओं को भी हटा देता है और फिर मैं एक्सटेंशन के साथ साफ़ स्ट्रिंग बना देता हूं।

function sanitaze_upload_file($data) 
{ 
    $imgName = $data; 
    $indexOFF = strrpos($imgName, '.'); 
    $nameFile = substr($imgName, 0,$indexOFF); 
    $extension = substr($imgName, $indexOFF); 
    $clean  = preg_replace("([^\w\s\d\-_~,;\[\]\(\)])", "", 
    $nameFile); 
    $NAMEFILE = str_replace(' ', '', $clean).$extension; 
    return $NAMEFILE; 
} 
संबंधित मुद्दे