2009-06-26 11 views
9

मुझे कुछ डेटा को स्वच्छ करने की आवश्यकता है जिसका उपयोग फ़ाइल नामों में किया जाएगा। कुछ डेटा में रिक्त स्थान और एम्परसेंड वर्ण हैं। क्या कोई ऐसा फ़ंक्शन है जो फ़ाइल नाम (या पथ) में उपयोग करने के लिए उपयुक्त डेटा से बच जाएगा या sanitize? मुझे PHP मैनुअल के 'फाइल सिस्टम फंक्शन' अनुभाग में कोई नहीं मिला।फ़ाइल नामों के लिए मुझे कौन से पात्रों से बच/sanitize करना चाहिए?

तो, मुझे लगता है कि मुझे अपना स्वयं का फ़ंक्शन लिखना है, मुझे कौन से पात्रों को बचने (या बदलने) की आवश्यकता है?

उत्तर

5

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

10

विंडोज के लिए:

/ \ : * ? " < > | 

यूनिक्स, तकनीकी रूप से कुछ भी नहीं है के लिए, लेकिन व्यवहार में विंडोज के रूप में एक ही सूची समझदार होगा।

रिक्त स्थान या एम्परसैंड्स के साथ कुछ भी गलत नहीं है जब तक कि आप फ़ाइलों को जोड़ते समय कमांड लाइनों पर उद्धरणों का उपयोग करने के लिए तैयार हों।

(Btw, मैं उस सूची एक त्रुटि संदेश से एक कॉलन सहित कुछ करने के लिए Windows पर फ़ाइल, और नकल का नाम बदलने की कोशिश कर रहा द्वारा मिला है।)

2

जब फ़ाइल नामों के लिए तार प्रतिबंध लगाया है, हम बाहर 0x20 नीचे सभी पात्रों को फ़िल्टर , साथ ही <,>,:, ", /, \, |,?, और *

2

विंडोज के लिए, यदि आप नहीं चाहते हैं तो" "सूची में जोड़ें, यदि आप नहीं चाहते हैं। यह वह वर्ण है जो डेटा के कुछ डिस्प्ले में "अगला चरित्र मेरी हॉटकी" कहता है। (पुराने विंडोज़ में सबसे आम है, लेकिन फिर भी यहां और वहां पॉप अप करता है।) तो "एम & एम" के बजाय आप "एम" देखेंगे _एम "... के बाद चरित्र एम्पर्सेंड (एक स्पेस) एक "हॉटकी" है, और इस प्रकार रेखांकित किया गया है।

3

[a-z0-9 _ \ -।] के बाहर सब कुछ हटाने का अच्छा विचार हो सकता है। यह सख्त होना जरूरी नहीं है, लेकिन किसी भी आश्चर्य के बिना निर्देशिका सूची रखना आरामदायक है। यदि आप कुछ अजीब चरित्र सेटों के साथ काम कर रहे हैं, तो हो सकता है कि आप अपमानजनक वर्णों को हटाने से पहले एन्कोडिंग को फ्लैट एसीआईआई में परिवर्तित करना चाहते हैं (या आप सबकुछ हटाने के साथ समाप्त हो सकते हैं) ...

कम से कम मैं कैसे ऐसा करें :-)

4

वर्णों को फ़िल्टर करने के बजाय क्यों न केवल [a-z0-9- [email protected]#$%^()] को अनुमति दें? संभावित रूप से समस्याओं का कारण बनने वाले हर चरित्र को अनुमान लगाने की कोशिश करना निश्चित रूप से आसान है।

आपके उपयोगकर्ताओं को किसी अन्य पात्र के साथ फ़ाइल की आवश्यकता नहीं है, है ना?

+1

वास्तव में, जब सुरक्षा/विश्वसनीयता आदि की बात आती है तो श्वेतसूची हमेशा सर्वोत्तम लगती है। –

0
@merkuro answer की

कार्यान्वयन:

function getSafeFilesystemFileName() { 
    return (
     md5($id . '-' . $filename) . 
     '.' . pathinfo($filename, PATHINFO_EXTENSION) 
    ); 
} 

कहाँ:

  • $id डेटाबेस
  • $filename से रिकॉर्ड आईडी है मूल अपलोड के फ़ाइल नाम (भी रिकॉर्ड में संग्रहीत)
है

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

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