2012-01-19 12 views
34

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

मैं सोच रहा था, शायद वे कुछ पथ में फ़ाइल (चित्र) को सहेज लेंगे और बस उस पथ को डेटाबेस में सहेज लें, है ना?

लेकिन मैं इसे इस तरह से करना चाहता हूं। क्या यह सही है? उदाहरण के लिए, www.photos.com नाम की एक वेबसाइट। जब कोई उपयोगकर्ता कोई चित्र अपलोड करता है तो मैं उपयोगकर्ता नाम का एक फ़ोल्डर बनाउंगा और उस फ़ोल्डर में उन चित्रों को सहेज दूंगा।

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

उदाहरण: यदि उपयोगकर्ता का नाम जॉन है, तो मैं फोटो.com www.photos.com/john/ पर इस तरह की एक निर्देशिका तैयार करूंगा और फिर एक तस्वीर अपलोड करते समय अपनी सभी तस्वीरें इस निर्देशिका में सहेज लेगा। क्या यह करने का यह सही तरीका है?

मेरे पास कोई भी नहीं है जिसके पास सर्वरों को फ़ाइलों को सहेजने का अच्छा ज्ञान है, तो कृपया मुझे यह कैसे पता चलेगा? मैं इसे सही और सुरक्षित तरीके से करना चाहता हूं।

+2

@ एड्रियन कॉर्निश क्या आप मुझे बता सकते हैं कि आपने क्या प्रयास किया है? मैं आपको मेरे लिए एक कोड लिखने के लिए नहीं कह रहा हूं, मैं सिर्फ एल्गोरिदम या अधिकांश लोगों को जिस प्रक्रिया का पालन करता हूं, ताकि मैं आगे बढ़ सकूं यदि मुझे पता है कि – niko

+0

फिर से क्या करना है? आप फ़ाइल के लिए पथ संग्रहीत कर सकते हैं, आप डेटाबेस में बाइनरी डेटा स्टोर कर सकते हैं। आपका वास्तविक सवाल क्या है? –

+0

आपका प्रश्न बुरी तरह से phrased है - आप पूछ रहे हैं कि चित्र कैसे अपलोड करें। चित्रों को अपनी साइट पर अपलोड करने के लिए कैसे नहीं।इसके अलावा क्या आप अपलोड दुर्भावनापूर्ण कोड, छिपे हुए पेलोड के साथ छवियों से उपयोगकर्ताओं को बचाने के लिए कर रहा है, लोगों को रोकने के लिए सिर्फ एक index'able यूआरएल –

उत्तर

125

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

क्यों? प्रदर्शन।

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

वे चित्रों को वास्तव में निजी कैसे रख सकते हैं जो आप पूछ सकते हैं? वे नहीं करते

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

This picture is private सूचना फ़ाइल नाम
10400121_87110566301_7482172_n.jpg
(फेसबुक समय-समय पर यूआरएल बदल कर लिंक तोड़ा जा सकता है)

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

संपादित करें (तुम क्यों 'यूजरनेम' फ़ोल्डर में छवियों की दुकान नहीं करना चाहिए:।
के बाद अपने संपादित यह स्पष्ट हो गया है कि आप डिस्क पर और डेटाबेस पर नहीं फ़ाइलें डाल करने के इरादे कर यह संपादन नया परिदृश्य को शामिल किया गया ।

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

अब आपके पास 11 उपयोगकर्ता हैं, मान लें कि वे एक ही समय में अपलोड करना शुरू करते हैं और प्रत्येक 100GB से अधिक फ़ाइलों को अपलोड करेगा। जब वे 91 जीबी तक पहुंचते हैं तो सर्वर पूरा हो जाता है और आपको एक अलग सर्वर पर छवियों को संग्रहित करना प्रारंभ करना होगा। यदि उस उपयोगकर्ता/फ़ोल्डर संरचना का पालन किया जाता है तो आपको उपयोगकर्ताओं में से एक का चयन करना होगा और अपने सभी डेटा को एक अलग सर्वर पर माइग्रेट करना होगा। साथ ही, यह उस उपयोगकर्ता पर हार्ड-सीमा बनाता है जो फ़ाइलों में 1T से अधिक अपलोड नहीं कर सकता है।

क्या मुझे सभी फ़ाइलों को एक ही फ़ोल्डर में स्टोर करना चाहिए?
नहीं, बड़ी साइटें आमतौर पर अनुक्रमिक फ़ोल्डर्स (/ 000001 /,/000002 /, आदि) में फ़ाइलों को संग्रहीत करती हैं जिनमें प्रति फ़ोल्डर फ़ाइलों की एक एक्स परिभाषित संख्या होती है। यह मुख्य रूप से फाइल सिस्टम प्रदर्शन के मुद्दों के लिए है।

how many files in a directory is too many?

+14

शानदार विवरण। वास्तव में जो मैं खोज रहा था, धन्यवाद। – CyberJunkie

+0

आप फ्रेंकी धन्यवाद, कि वास्तव में बहुत स्पष्ट है। लेकिन एक और तरीका है जो मुझे और अधिक दिलचस्प बनाना चाहिए: चित्रों को एक विशिष्ट तस्वीर भंडारण प्रदाता पर स्टोर करें। – Fred

+1

@Fred बिल्कुल सही है। यह उत्तर विशेष रूप से किसी ऐसे व्यक्ति पर सही मानसिकता सेट करने के लिए डिज़ाइन किया गया है, जिस पर कोई जानकारी नहीं है कि चीजें कैसे काम करती हैं। जैसे ही आप अपनी साइट पर कुछ मिलियन चित्रों को होस्ट करना शुरू करेंगे, आप शायद उन संपत्तियों को होस्ट करने और/या आउटसोर्स को आउटसोर्स करना चाहते हैं। मानसिकता, हालांकि, वही रहता है। डेटाबेस पर आप केवल छवि स्थान का संदर्भ देते हैं। टिप्पणी के लिए धन्यवाद। – Frankie

4

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

रूस में सबसे बड़ा सोशल नेटवर्क, Vkontakte बिल्कुल यह करता है: फाइल सिस्टम में छवियों को स्टोर करें।

एक और बड़े सोशल नेटवर्क ने एक परिष्कृत स्केलेबल ब्लॉब स्टोरेज लागू किया। लेकिन यह जनता के लिए उपलब्ध नहीं है, AFAIK।

इस उत्तर का सारांश: डेटाबेस में ब्लॉब्स स्टोर न करें।

1

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

एक MySQL ™ BLOB फ़ील्ड में छवियों को अपलोड करना इतना बुरा विचार है कि छवियां आमतौर पर समस्याग्रस्त होती हैं यदि छवियां थंबनेल से बहुत बड़ी होती हैं। यदि छवियां बड़ी हैं, तो आप एक समय में एक SQL INSERT कथन को कॉपी/पेस्ट करने के लिए समाप्त कर सकते हैं (phpMyAdmin में)। यदि छवियां बड़ी हैं और SQL INSERT कथन आपके टेक्स्ट एडिटर द्वारा दो पंक्तियों में विभाजित है, तो आप कभी भी छवि को पुनर्स्थापित करने में सक्षम नहीं होंगे।

2

करने के लिए हाँ यह सही तरीका है।
एकमात्र चीज जिसे मैं नाम और आईडी का उपयोग करने का सुझाव देना चाहता हूं।
www.photos.com/albums/1234/ स्टार्टर के लिए ठीक रहेगा।

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

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