अपलोड की गई छवियों के नामकरण के लिए सबसे अच्छा अभ्यास क्या है?


15

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

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

शायद एक GUID?

a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg

एक टाइमस्टैम्प?

129899740140465735.jpg

A हैश? Ex: md5

b1a9acaf295cf14ffbc5b6538294562c.jpg

क्या ऐसा करने के लिए कोई मानक या अनुशंसित तरीका है?


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

टाइमस्टैम्प एक अच्छा विचार नहीं है, क्योंकि DateTime.Now केवल हर 15ms में ताज़ा है। टकराव की एक उच्च संभावना है, उदाहरण के लिए थोकभार, कतारबद्ध अनुरोधों आदि के दौरान
jhexp

जवाबों:


27

आपको दो लक्ष्यों को पूरा करने की कोशिश करनी चाहिए: विशिष्टता और उपयोगिता।

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

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

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

उदाहरण के लिए, यदि कोई फ़ाइल "माई हॉलिडे: फ्लोरिडा 23.jpg" अपलोड की जाती है, तो userID 98765, 2013/04/04 को 12:51:23 पर, मैं इसे कुछ इस तरह नाम दूंगा, एक यादृच्छिक स्ट्रिंग जोड़ना ad8a7dsf9:

20130404125123-ad8a7dsf9-98765-मेरी-छुट्टी फ्लोरिडा 23.jpg

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

7
हाउसकीपिंग के लिए, मैं प्रति यूजरआईडी के लिए अलग निर्देशिका बनाने की सलाह दूंगा ताकि यदि आप एक उपयोगकर्ता को हटा दें तो आपको उनके सभी चित्रों के लिए शिकार नहीं करना पड़ेगा। - अतः98765/20130404125123-ad8a7dsf9-my-holiday-florida-23.jpg
शादुर

1
यादृच्छिक स्ट्रिंग द्वारा सैद्धांतिक रूप से विशिष्टता प्रदान नहीं की जाती है।
Kolyunya

4
@Kolyuny, यह सही है, इस मायने में कि वैश्विक विशिष्टता की गारंटी एक संपत्ति नहीं है जो कि वास्तविक जीवन में भी GUIDs है, (यहां तक ​​कि डुप्लिकेट मैक पते जारी करने के कारण v1 छापे का भंडाफोड़ किया गया है)। आप सभी प्राप्त कर सकते हैं अद्वितीयता की एक सांख्यिकीय संभावना है। लेकिन यदि फ़ाइल पहले से मौजूद है (तो CreateFileसाथ में उपयोग कर रहा है CREATE_NEW), और यदि ऐसा होता है तो अलग-अलग यादृच्छिकता का उपयोग करके आप जाँच करके विशिष्टता सुनिश्चित कर सकते हैं ।
बेन

'सब कुछ लोअर केस में बदल जाता है और कुछ भी गैर-अल्फ़ान्यूमेरिक हटा दिया जाता है और डैश द्वारा प्रतिस्थापित कर दिया जाता है,' मैं इसे मिश्रित केस
रखूंगा

4

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

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

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

यदि आप एक RDBMS के साथ संयोजन के रूप में यह कर और कई श्रेणियों, अर्थात् उत्पादों, श्रेणियों, आदि है रहे हैं तो आप हो सकता है upload\products, upload\categories, और इतने पर है, और आप फ़ाइल नाम के रूप में पंक्ति आईडी इस्तेमाल कर सकते हैं।

सर्वोत्तम प्रथाओं के संदर्भ में, मैंने भी अतीत में देखा है और कुछ भी नहीं पाया है। मैं अपने कुछ डेवलपर्स के साथ चर्चा करते हुए ऊपर आया।


2

मैंने सालों पहले जो समाधान किए उनमें से एक में हमने यह किया: उपयोगकर्ता आईडी के भाग के लिए उप फ़ोल्डर्स तो अगर आपकी उपयोगकर्ता आईडी 232950192 थी

हमारे पास उप-फ़ोल्डर चित्र / 23/29/50/192/232950192 होंगे

अंतिम फ़ोल्डर में एल्बुन और प्रोफाइल इमग आदि के लिए फ़ोल्डर हैं

लेकिन हम डेटा बेस में भी सब कुछ बचाते हैं और इसे त्वरित वेब सर्वर एक्सेस के लिए फाइल सिस्टम में रखते हैं (जिसमें कैशिंग भी है)

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

जावा में एक उप फ़ोल्डर बनाना और उसमें एक फ़ाइल बनाना बहुत आसान है:

    File folder = new File(pathwithslashes);// like "images/23/29/50/192/232950192"
    folder.mkdirs();
    File imgFile = new File(folder, name);
    //Now get output stream etc

सबफ़ोल्डर्स में डेट स्टैम्प प्राप्त करने के लिए: SimpleDateFormat sdf = new SimpleDateFormat ("/ yyyy / MM / dd /"); pathwithslashes = pathwithslashes + sdf.format (now); // अब एक उपयोग है। फाइल फ़ाइल फ़ोल्डर = नई फ़ाइल (pathwithslashes);

डॉट नेट /programming/5482230/c-sharp-equivalent-of-javas-mkdirs


नेस्टेड निर्देशिकाओं का सुझाव देने के लिए +1। मुझे लगता है कि यह विभिन्न फ़ाइल सिस्टम के रूप में विचार करने के लिए प्रदर्शन के मुद्दों का सामना करते हैं फ़ोल्डर "भी कई" फ़ाइलें शामिल कर सकते हैं महत्वपूर्ण है: stackoverflow.com/questions/197162/... , support.microsoft.com/kb/130694/en-us , आदि
deizel

1
हां, एक अन्य सिस्टम पर वेब सर्वर के हैंग होने पर हमने एक dir पर rmdir करने की कोशिश की जिसमें 400,000 से अधिक फाइलें थीं। हमारे पास इस तरह के और भी फोल्डर थे। इसलिए एक कस्टम प्रोग्राम का उपयोग किया, जिसे dir / p कहा जाता है ताकि एक बार में कुछ फ़ाइलों को डिलीट किया जा सके। कुछ घंटे लगे, लेकिन समय कम नहीं हुआ :)
tgkprog

1

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

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

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

ध्यान रखें कि आजकल, जब मोबाइल इंटरफेस हावी हो रहे हैं, वास्तविक फ़ाइल नाम एक कम महत्वपूर्ण बात है कि यह 5, 10 साल पहले था। लेकिन यहां तक ​​कि अगर यह आपके आवेदन के संदर्भ में महत्वपूर्ण होगा, तो आप हमेशा Content-Disposition: attachment; filename="pretty_file_name.jpg"HTTP हेडर को शामिल करने के साथ कुछ पुराने स्कूल मैजिक को शामिल कर सकते हैं, जिससे आप अपनी इच्छा के अनुसार किसी भी प्रासंगिक फ़ाइल नाम का निर्माण कर सकते हैं। इसके अलावा, आधुनिक ब्राउज़र नई HTML5 विशेषता, डाउनलोड करने का मार्ग प्रशस्त कर रहे हैं । मुझे विश्वास नहीं है कि वास्तव में "मानव पठनीय" छवि नाम देखना एक ऐसी चीज है जिसके बारे में आपको अधिकांश मामलों में सोचना चाहिए।

UPD: एक निर्देशिका में बहुत सारी फाइलें न होने के लिए एक संशोधन किया जा सकता है - बस पहले 3 अक्षर लें और dir बनाएं।


1
हालांकि md5 वास्तव में अद्वितीय है?
इव्रीस

@ I.देवरी, मैं कोई विशेषज्ञ नहीं हूं, लेकिन जहां तक ​​मुझे पता है, यह इस उद्देश्य के लिए पर्याप्त है। आप अतिरिक्त फ़ाइल के आकार की जांच करेंगे खास तौर पर अगर, के बाद से अच्छा हैशिंग एल्गोरिथ्म वास्तव में है कि एक ही आकार संस्थाओं अनुदान कम शायद एक टक्कर होगा - stackoverflow.com/questions/2442632/...
shabunc

-1

Sha4 जैसी किसी चीज से टकराने की संभावनाएं असीम हैं। यदि आप हैश को यूजरआईडी या साधारण तिथि के साथ जोड़ते हैं, तो भी कम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.