2009-08-11 13 views
5

मैं निम्नलिखित कोडएक रेस स्थिति

$date = date('U'); 
$user = $_SERVER[REMOTE_ADDR]; 
$filename = md5($date.$user); 

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

उदाहरण के लिए, मैं एक अपलोड/आकार/छवि अपलोड स्क्रिप्ट सहेज रहा हूं। स्क्रिप्ट का पहला ऑपरेशन आकार बदलती छवि को कॉपी और सहेजना है, जिसे मैं एक अद्वितीय नाम असाइन करने के लिए डेट फ़ंक्शन का उपयोग करता हूं। फिर स्क्रिप्ट प्रक्रिया को सहेजती है और पूरे अपलोड को सहेजती है, और इसे एक नाम असाइन करती है। स्क्रिप्ट के अंत में ($thumb और $full वेरिएबल्स हैं), मुझे एक MySQL डेटाबेस में डालने की आवश्यकता है, जब मैंने अपलोड सहेज लिया था तब फ़ाइल नाम।

समस्या है, कभी कभी बड़ी छवियों पर यह (या, सेकंड बदलने की प्रक्रिया के दौरान) एक अलग फ़ाइल नाम में जिसके परिणामस्वरूप डेटाबेस में डाल दिया जा रहा है की तुलना में है कि क्या वास्तव में फ़ाइल अंतर्गत सहेजा जाता है एक दूसरे की तुलना में अधिक समय लगता है।

क्या यह नामकरण के इस तरीके का उपयोग करने के लिए एक अच्छा विचार नहीं है?

उत्तर

5

AFAIK यह फाइलों का नाम देने का एक शानदार तरीका है, हालांकि मैं file_exists() देख सकता हूं और शायद यादृच्छिक संख्या पर काम कर सकता हूं।

आपको उस फ़ाइल नाम को एक चर में संग्रहीत करने और बाद में इसे फिर से संदर्भित करने की आवश्यकता है, बजाय प्रत्येक बार एल्गोरिदम पर निर्भर रहने के बजाय। यह उपयोगकर्ता $_SESSION, एक कुकी, एक जीईटी चर, आदि में pageloads के बीच संग्रहीत किया जा सकता है।

आशा में मदद करता है (प्रति ऐ के रूप में)

+1

ऐसा लगता है कि यह वास्तविक प्रश्न है जो "मैं एक अद्वितीय नाम कैसे उत्पन्न करूं" के बारे में नहीं हूं बल्कि "मैं नाम दो बार कैसे रोकूं"। – Lucky

0

उपयोग करने के लिए नहीं क्यों

$filename = md5(rand()); 

यह सुंदर हर मामले में बहुत अनूठा हो जाएगा। और यदि आपको लगता है कि $filename पहले से मौजूद है तो आप इसे फिर से कॉल कर सकते हैं।

+1

रैंड() "बहुत अधिक" अद्वितीय होगा, लेकिन $ तारीख। $ समय अद्वितीय होगा। एक दूसरे के लिए व्यापार क्यों करें, और इसके अलावा वास्तविक प्रश्न को संबोधित नहीं करते हैं। – Lucky

2

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

मुझे फ़ाइलों को अपलोड करने के लिए आप जिस प्रक्रिया का पालन कर रहे हैं, उसके बारे में निश्चित नहीं हूं, लेकिन फ़ाइल अपलोड को संभालने का एक और तरीका है PHP के हैंडलर में निर्मित है। आप फ़ाइल अपलोड कर सकते हैं और फिर अस्थायी स्थान से अपलोड की गई फ़ाइलों को खींचने के लिए "सुरक्षित" विधियों का उपयोग कर सकते हैं। (इस उदाहरण में अस्थायी जगह छेड़छाड़ को रोकने के लिए खुले आधार डीआईआर निर्देश के बाहर सुरक्षित रूप से स्थित हो सकती है)। is_uploaded_file() और move_uploaded_file() से: http://php.net/manual/en/features.file-upload.post-method.php उदाहरण 2 आपके द्वारा सामना की जा रही समस्या को संभाल सकता है।

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

2

बस यह जोड़ें कि उस php में पहचानकर्ता बनाने के लिए एक फ़ंक्शन है: uniqid। आप पहचानकर्ता को एक स्ट्रिंग (दिनांक शायद?) के साथ उपसर्ग भी कर सकते हैं।

हमेशा अपने उपयोगकर्ता के इनपुट और सर्वर शीर्षलेखों को सत्यापित करें!

0

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

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

1

मुझे अभी पता चला है कि PHP के लिए टेम्प-इन नामक एक अंतर्निहित फ़ंक्शन है। यह दौड़ की स्थिति से भी बचाता है। http://php.net/manual/en/function.tempnam.php देखें।

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