2010-09-03 22 views
8

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

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

मैं के बारे में क्या संयोजन मैं नाम बदली गई फ़ाइल के लिए देने के लिए और भी यकीन है कि यह अद्वितीय फ़ाइल नाम रहेगा अधिक मैं तुम मेरी निर्देशिका संरचना

को समझने के लिए चाहते हैं जैसा कि मैंने कहा नहीं होगा सटीक होना करने के लिए करना चाहिए उलझन में हूँ तीन चित्रों फाइलें व्यवस्थापक अर्थात् अपलोड करने की जाएगी

क) शीर्षक चित्र ख) संक्षिप्त चित्र ग) विस्तार से चित्र

और सभी तीन चित्र फ़ाइलें अलग-अलग संबंधित निर्देशिका में स्थानांतरित हो जाएं, जैसे शीर्षक चित्र शीर्षक निर्देशिका पर जाता है और इसी तरह।

मैं वर्तमान में नीचे दिए गए स्क्रिप्ट का उपयोग डेटाबेस में वर्कर का उपयोग करके फ़ाइल नाम को स्थानांतरित करने और संग्रहीत करने के लिए कर रहा हूं।

$ns_pic_title_loc= $_FILES["ns_pic_title"]["tmp_name"]; 
$ns_pic_title_name = $_FILES["ns_pic_title"]["name"]; 
move_uploaded_file($ns_pic_title_loc, $ns_title_target.$ns_pic_title_name) or die(mysql_error()); 

यह केवल नमूना कोड है जिसमें मैंने उपयोग किए गए सत्यापन फ़ंक्शन को शामिल किया है। मैं सोच रहा था कि मैं

ए) की सभी फ़ाइलों का नाम बदलना चाहता हूं ए) शीर्षक निर्देशिका में फ़ाइल को संग्रहीत किया जाना चाहिए। title_1.jpg title_2.jpg title_3.jpg title_4.jpg

और इतने

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

धन्यवाद अग्रिम में

उत्तर

2

ठीक है, यहाँ एक संभव समाधान है:

  1. $_FILES["ns_pic_title"]["name"] एवं अलग एक्सटेंशन से अपलोड की गई फ़ाइल नाम जाते हैं या यदि हम केवल छवि फ़ाइलों के बारे में बात कर रहे हैं getimagesize($_FILES["ns_pic_title"]["tmp_name"]) साथ छवि प्रकार मिलता है,
  2. छवि अभिलेखों की अधिकतम आईडी के लिए अपने डेटाबेस की जाँच करें और आप $ file_name और $ FILE_EXTENSION होनी चाहिए ताकि move_uploaded_file($_FILES["ns_pic_title"]["tmp_name"], $ns_title_target.$file_name.'.'.$file_extension)

कर इस बिंदु पर $file_name चर 'title_'.($max_id + 1)

  • बनाने उम्मीद है कि इस समझ में आता है और मदद करता है ।

  • +0

    यह अभी भी डेटाबेस से आईडी/प्राथमिक कुंजी का उपयोग करते हुए ब्लॉब सुझाव का एक बेहतर विकल्प है। मैंने इसे कई बार इस्तेमाल किया है। – Treffynnon

    +1

    हालांकि यह एक अच्छा समाधान है, मैं tempnam फ़ंक्शन का उपयोग करने पर विचार करता हूं। बस जिस तरह का काम मैं ढूंढ रहा था। –

    +0

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

    2

    विभिन्न पक्ष-विपक्ष के साथ अच्छे विकल्पों में से एक जोड़े हैं।

    • php के tempnam जब फाइल आगे बढ़, और अपने mysql डेटाबेस में पथ की दुकान का प्रयोग करें। tempnam एक अद्वितीय फ़ाइल नाम उत्पन्न करता है।

    • Use mysql to store the image content in a blob। इस तरह आप पथनाम के बजाय आईडी सामग्री के माध्यम से छवि सामग्री तक पहुंच पाएंगे।

    +4

    मैं वास्तव में डेटाबेस में अपनी साइट की छवियों को संग्रहीत करने की अनुशंसा नहीं करता हूं। डेटाबेस के साथ प्रदर्शन समस्याएं उत्पन्न हो सकती हैं और आपको छवियों के कैशिंग की कमी भी होगी। – janosrusiczki

    +1

    मैं tempnam फ़ंक्शन का उपयोग करूंगा और मैं निश्चित रूप से ब्लॉब का उपयोग करने से बचूंगा, मैंने पहले ब्लॉब का उपयोग किया था और मुझे प्रदर्शन समस्या में शामिल कर लिया था। +! संक्षिप्त tempnam के लिए धन्यवाद। –

    +0

    मैं सहमत हूं, मैंने केवल पूर्णता के लिए ब्लॉब सुझाव जोड़ा है। –

    2
    इसके बजाय यह पता लगाने की क्या नवीनतम चित्र नाम है और गणना अगले संख्या वेतन वृद्धि तर्क होने के

    , क्यों नहीं बस PHP's tempnam() function का उपयोग करें? यह आपकी पसंद के उपसर्ग के साथ एक अद्वितीय नाम उत्पन्न करता है (यानी, "शीर्षक", "संक्षिप्त", "विवरण")।आप फ़ाइल नाम पर एक टाइमस्टैम्प भी तैयार कर सकते हैं - यदि आपके पास एक ही समय में चित्र अपलोड करने वाले बहुत से व्यवस्थापक नहीं हैं, तो अधिकांश नाम विवादों को संभालना चाहिए।

    अपने चित्रों के बाद से पहले से ही title, brief और detail निर्देशिका में क्रमबद्ध किया जा करने के लिए जा रहे हैं, यह वास्तव में आवश्यक हो, तो सही है कि प्रत्येक तस्वीर title_*, brief_*, और detail_* नाम है? यदि यह शीर्षक निर्देशिका में है, तो यह स्पष्ट रूप से एक शीर्षक चित्र है।

    इसके अलावा, आप डेटाबेस में फ़ाइल नाम डालने जा रहे हैं। फिर ऐप में कहीं और, जब आप एक तस्वीर प्रदर्शित करना चाहते हैं, तो मुझे लगता है कि आपको डेटाबेस से सही फ़ाइल नाम मिल रहा है। तो यह वास्तव में महत्वपूर्ण नहीं है कि वास्तविक फ़ाइल नाम तब तक है जब तक एप्लिकेशन को यह पता चल जाए कि उसे कहां मिलना है। यदि यह सही है, तो एक बहुत ही दोस्ताना नाम होना आवश्यक नहीं है, इस प्रकार एक tempnam() फ़ाइल का नाम या एक टाइमस्टैम्प प्लस मूल फ़ाइल नाम स्वीकार्य होगा।

    +0

    वाह, बस जिस तरह का फ़ंक्शन मैं खोज रहा था, आप ऊपर से नीचे तक सही हैं। मैं अभी कोशिश कर रहा हूं .. बहुत बहुत धन्यवाद। –

    0

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

    मैं इस पद्धति का उपयोग करता हूं, और मेरे परीक्षण में से कोई भी डिस्क नाम (डेटाटाइम से md5) में कभी भी कई प्रयासों की आवश्यकता नहीं होती है।

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