PDA

View Full Version : یه سوال از اساتید درمورد بهترین روش ذخیره تصاویر در برنامه نویسی



alavigold
پنج شنبه 03 اردیبهشت 1394, 17:08 عصر
سلام
به نظر اساتید برای ذخیره تصاویر و نمایش آنها از کدام روش استفاده کنم:1- تمام اطلاعات رو کامل در دیتابیس ذخیره کنم(تصویر و نام و...) 2- یا نام تصویر رو در دیتابیس و فایل تصویر رو هم روی هاست اپلود کنم. 3- اصلا کاری به دیتابیس نداشته باشم و روی هاست آپلود کنم.
کلا کدام روش مناسب هست هم از نظر امنیتی و هم از نظر سرعت بارگذاری!
اصلا چه موقع باید از این سه روش استفاده کرد!
میخوام یه اسلایدر درست کنم(تصویر و متن) و یه قسمت نمایش مشتریان(فقط تصویر).
لطفا راهنمایی کنید از کدام روش بهتر است برای این دو منظور استفاده کنم!
بااحترام

leaping
پنج شنبه 03 اردیبهشت 1394, 17:23 عصر
از نظر من حجم دیتابیس رو با این چیزا بالا نبر :)
تصویر رو روی سرور آپلود کن

reza_alie
پنج شنبه 03 اردیبهشت 1394, 20:52 عصر
بهتره که نام یا آدرس تصویر رو داخل دیتا بیس ذخیره کنی

-سیّد-
پنج شنبه 03 اردیبهشت 1394, 23:12 عصر
بستگی به کاربرد داره.
اگه اسم و/یا آدرس تصاویر رو توی پایگاه داده ذخیره کنید، به شما قابلیت انعطاف بیشتری می‌ده و مثلاً می‌تونید روش query بزنید و ازش آمار بگیرید. اما یه لایه به پیچیدگی کار اضافه می‌شه.
از طرفی اگه مستقیم توی filesystem بزنید، ساده‌ترین و پرسرعت‌ترین کار هست و خیلی هم ساده هست، ولی دیگه خیلی نمی‌شه باهاش ژانگولر زد!
در نهایت اگه کل عکس رو توی پایگاه داده بریزید، خیلی چیز خاصی به دست نمیارید و به قول دوستمون الکی حجم پایگاه داده بالا می‌ره.

Vahid2016
جمعه 04 اردیبهشت 1394, 00:34 صبح
اصلا چه موقع باید از این سه روش استفاده کرد!
روش اول برای حالتی خوب هست که تصاویر خصوصی مد نظرتون باشه ، یعنی بخواین فقط کاربر یا کاربران خاصی بتونن تصویر رو ببینن ، و میزبان یا کسی که به هر طریقی به سرور دسترسی پیدا میکنه نتونه براحتی تصاویر رو بخونه ، در این صورت فک میکنم استفاده از دیتابیس بهتر باشه ، اما غالبا همونطور که دوستان هم گفتن روش دوم بهتره ، روش سوم توصیه نمیشه..

-سیّد-
جمعه 04 اردیبهشت 1394, 07:58 صبح
روش سوم توصیه نمیشه..
ممنون می‌شم دوستان با منبع صحبت کنن. یا حداقل با دلیل.
من خودم برام مواقعی پیش اومده که روش سوم برام مناسب بوده. می‌شه اگه مشکل خاصی در مورد روش سوم مد نظرتون هست بفرمایید؟

یه نکته هم یادم رفت بگم:
استفاده از filesystem برای ذخیره‌سازی عکس‌ها (چه روش دوم، چه روش سوم) یه مزیت خیلی بزرگ نسبت به ذخیره‌سازی اونا توی پایگاه داده داره. وقتی شما فایل رو توی filesystem ذخیره می‌کنید و آدرسش رو مستقیم به client می‌دید، همه‌ی اتفاقات خوب می‌افته: فایل cache می‌شه، resume به صورت خودکار پشتیبانی می‌شه، سرعت خوندن فایل از روی دیسک احتمالاً بیشتر از خوندنش از پایگاه داده هست، در صورت آسیب دیدن دیسک دهها نرم‌افزار برای recover کردنش هست، دهها قابلیت دیگه که روی filesystem ها کار می‌کنن در اختیارتون هست (مثلاً replication) و ...
اما در صورت استفاده از پایگاه داده، بعضی از اینا رو باید خودتون پیاده‌سازی کنید (مثل cache و resume) و بعضی رو هم باید دعا کنید که پایگاه داده‌تون پشتیبانی کنه! (مثل replication)

در ضمن یه خوبی روش دوم (ذخیره کردن آدرس در پایگاه داده) نسبت به روش سوم (همینطوری فایل‌ها رو ردیف کردن توی filesystem) اینه که در روش سوم، احتمالاً اسم فایل‌هاتون باید قابل پیش‌بینی باشه تا بدون نیاز به پایگاه داده بتونید ازشون استفاده کنید (مثلاً img1.jpg و img2.jpg و img3.jpg و ...). در این صورت، اگه تعداد عکس‌هاتون نسبتاً زیاد باشه (مثلاً عکس‌هایی که کاربرا آپلود می‌کنن) اون وقت یه نفر می‌تونه یه برنامه‌ی خیلی ساده بنویسه و تمام عکس‌های سایت شما رو دانلود کنه! ولی اگه از پایگاه داده استفاده کنید، می‌تونید برای نامگذاری عکس‌ها از روش‌های کدینگ ساده استفاده کنید، یا مثلاً براشون یه GUID بسازید:
https://en.wikipedia.org/wiki/Globally_unique_identifier
در این صورت، کسی که بخواد همه‌ی عکس‌ها رو دانلود کنه، مجبوره برای هر پروفایل یه درخواست بده به شما و فهرست عکس‌های اون پروفایل رو استخراج کنه، بعد دانلودشون کنه. اینطوری هم کارش سخت‌تر و طولانی‌تر می‌شه، هم اینکه راحت‌تر می‌تونید block اش کنید.

leaping
جمعه 04 اردیبهشت 1394, 09:12 صبح
روش اول برای حالتی خوب هست که تصاویر خصوصی مد نظرتون باشه ، یعنی بخواین فقط کاربر یا کاربران خاصی بتونن تصویر رو ببینن ، و میزبان یا کسی که به هر طریقی به سرور دسترسی پیدا میکنه نتونه براحتی تصاویر رو بخونه ، در این صورت فک میکنم استفاده از دیتابیس بهتر باشه ، اما غالبا همونطور که دوستان هم گفتن روش دوم بهتره ، روش سوم توصیه نمیشه..
کی گفته در روش آپلود بر روی سرور نمیشه عکسهارو خصوصی سازی کرد برای مشاهده؟

Vahid2016
جمعه 04 اردیبهشت 1394, 11:01 صبح
کی گفته در روش آپلود بر روی سرور نمیشه عکسهارو خصوصی سازی کرد برای مشاهده؟

نمی دونم ، کی گفته؟ شما بگین!!
آپلود روی سرور؟ در هر صورت فایلا روی سرور ذخیره میشن ، فقط اگه از filesystem استفاده بشه به راحتی قایل دسترسی هستن . مگر اینکه بخواید یه باینری 500 کیلوبایتی رو هر بار موقع ذخیره و خواندن انکریپت و دیکریپت بکنید؟ آیا مد نظر شما این هست؟؟
تازه درمورد ذخیره در دیتابیس هم خوندن عکس ها سخت میشه نه اینکه نشه خوندشون (البته باید کدهای حاوی کانکشن استرینگ و پسورد هم درد دید عموم قرار نگیره) ، در این روش هم فقط مبهم سازی صورت می گیره و نمیشه روش حساب کرد..
اگر ایرادی در گفته های من هست اصلاح بکنید یا اگر صحبتی چیزی دارید بفرمایید ، اینجا چت روم نیست که بیایم یه جمله پرت کنیم بریم ، بعد مدتی تازه یکی بیاد بگه منظورت چی هست ، بعد تازه اون یکی بیاد توضیح بده..





روش سوم توصیه نمیشه
ممنون می‌شم دوستان با منبع صحبت کنن. یا حداقل با دلیل.
من خودم برام مواقعی پیش اومده که روش سوم برام مناسب بوده. می‌شه اگه مشکل خاصی در مورد روش سوم مد نظرتون هست بفرمایید؟


من چیز خاصی نگفتم که با منبع بخوام صحبت کنم ، فقط گفتم توصیه نمیشه ، در واقع روش دوم و سومی وجود نداره دوم همون روش سوم هست ، با این تفاوت که اسم فایل و سایر موارد مربوطه اون رو بجای اینکه بیایم توی نام فایل یا فولدر یا روی در و دیوار یا یجای دیگه ذخیره کنیم میایم تو همون دیتابیس (هم) ذخیره میکنیم ، حالا چرا ؟ چون من با اطمینان کامل میگم به درد بخوره و ضرر نمی کنید از این کار، مگه اینکه به دلیلی نخواید یا نتونید از دیتابیس استفاده بکنید..ممکنه برای منم موردی پیش اومده باشه که از ثبت نکردن تو دیتابیس دردسر واسم پیش بیاد ولی احتمالا اونقدری مهم نبوده و الانم درست یادم نمیاد ، البته میشه سناریو هایی رو از تو نت از لابلای بحثا کشید بیرون گذاشت اینجا ولی من صادقانه میگم چیزی یادم نمیاد،

من خودم برام مواقعی پیش اومده که روش سوم برام مناسب بوده.
برا منم پیش اومده مثلا تو نرم افزارای دسکتاپ که نخواستم از دیتابیس استفاده کنم..اما چنین موردی تو وب واسم پیش نیومده


شما خودتون یبار بهم گفتین که برنامه نویسی اصولی .. رو میخواید یاد بگیری شاید تو همین پروژه های کوچیک به دردت نخوره و فک کنی بیهوده هست و مث چرخوندن لقمه دور سر اما باید خودت رو عادت بدی به کار کردن به این روش ، خب اینم مثل همون هست..
من خودم مث شما تو پروژه های بزرگ کار نکردم و تا حالا تو یه تیم حرفه ای نبودم و تجربه شما رو ندارم اما همونطور که قبلنم بهتون گفتم سعی میکنم از افرادی مث شما یاد بگیرم ، الان شما نگاه کنید این همه پروژه Open-Source و حرفه ای تو نت موجود هست تو کدوم یکی اسم فایل و سایر موارد مرتبط تو جداول ثبت نشده ؟

leaping
جمعه 04 اردیبهشت 1394, 11:12 صبح
دوست عزیز چرا انقد پیچیدش میکنی؟ :D
کافیه که از طریق آپاچی دسترسی مستقیم به تصویر رو ببنیدن و از طریق php و با اینکلود کردن فایل اون رو از طریق header به نمایش بگذارید.اینطوری میتونید خیلی راحت از طریق همون php شخصی سازیش هم بکنید. :)
و هنوزهم میگم آپلود بر روی سرور بهترین روشه

bagherok
جمعه 04 اردیبهشت 1394, 11:40 صبح
فرض کنید 100 تا تصویر 3 کلیوبایتی درون سایت میخوایم نمایش بدیم
خوب برای هرکدوم از این تصاویر مرورگر یه درخواست به سمت سرور میفرسته

خب دوباره فرض کنید درلحظه و همزمان 100 تا کاربر وارد سایت بشند
میشه 10000 درخواست

نمیشه گفت بهترین روشه کدوم
بهترین روش روشی هست که پرفرومنس بالاتری داشته باشه

Unique
جمعه 04 اردیبهشت 1394, 11:56 صبح
دوستان کمی با هم مهربون تر باشین. خوبه مثلا مهندسین این مملکت هستین.

جناب alavigold ، ذخیره در Database تا وقتی که دلیل بسیار قانع کننده ای وجود نداشته باشه اصلا و ابدا پیشنهاد نمیشه و میشه حتی گفت اشتباهه.
در مورد اینکه نام فایل را ذخیره کنید یا نه ! (نام فایل مهمه و آدرس اصلا اهمیتی نداره چون مربوط به منطق برنامه شما میشه و اصولا شما میدونین فایل توی چه آدرسی ذخیره شده) مهم اینه که نام فایل بعدا به کار میاد یا نه ! مثلا فکر کنید میخوایم کاربر بتونه فایل را با همون نام اصلی دانلود کنه. پس ذخیره کردن نام اصلی فایل لازمه ! یا مثلا شما میخواین چند نوع فایل را ذخیره کنید مثلا jog و gif و png خوب حالا اگه نام فایل را نداشته باشین برای پسوندش هی باید جمله شرطی بنویسین !

در نتیجه باید ببینین نام فایل جای استفاده داره یا نه ! فایل را هم با نام شماره ID رکورد نظیرش ذخیره کنید نه با اسم خودش ! اینجوری نیازی نیست نگران duplicate name ها باشین.

-سیّد-
جمعه 04 اردیبهشت 1394, 12:31 عصر
شما خودتون یبار بهم گفتین که برنامه نویسی اصولی .. رو میخواید یاد بگیری شاید تو همین پروژه های کوچیک به دردت نخوره و فک کنی بیهوده هست و مث چرخوندن لقمه دور سر اما باید خودت رو عادت بدی به کار کردن به این روش ، خب اینم مثل همون هست..
من خودم مث شما تو پروژه های بزرگ کار نکردم و تا حالا تو یه تیم حرفه ای نبودم و تجربه شما رو ندارم اما همونطور که قبلنم بهتون گفتم سعی میکنم از افرادی مث شما یاد بگیرم ، الان شما نگاه کنید این همه پروژه Open-Source و حرفه ای تو نت موجود هست تو کدوم یکی اسم فایل و سایر موارد مرتبط تو جداول ثبت نشده ؟
ببینید برنامه‌نویسی اصولی به این معنی نیست که هر چی دم دستتون هست حتماً استفاده کنید!
یه مهندس، باید بتونه کار رو درست و با هزینه‌ی مناسب انجام بده. اصولی انجام دادن کار، تضمین می‌کنه که کار درست انجام بشه. ولی معنیش این نیست که حتماً هزینه کلی بره بالا.
یه جاهایی (این مثال رو نمی‌گم، کلی می‌گم) واقعاً نیازی نیست آدم از پایگاه داده استفاده کنه و کارش با filesystem معمولی راه می‌افته.
یا مثلاً شما وقتی دیتاتون در حد چند صد هزار تا رکورد هست، واقعاً شاید نیاز نباشه برای پردازشش از MapReduce استفاده کنید!

من بازم می‌گم: باید دید که چه کاربردی وجود داره. این رو قبول دارم که در اکثر موارد گزینه‌ی دوم بهترین گزینه هست. ولی جاهایی هست که گزینه‌ی سوم هم مطرح می‌شه. حتی یه جاهایی ممکنه گزینه‌ی یک هم کاربردی باشه.


فرض کنید 100 تا تصویر 3 کلیوبایتی درون سایت میخوایم نمایش بدیم
خوب برای هرکدوم از این تصاویر مرورگر یه درخواست به سمت سرور میفرسته

خب دوباره فرض کنید درلحظه و همزمان 100 تا کاربر وارد سایت بشند
میشه 10000 درخواست

معمولاً مرورگرها همه‌ی درخواست‌های یه صفحه رو با هم نمی‌فرستن و محدودش می‌کنن به مثلاً ۱۰ تا همزمان. توی تنظیمات مرورگر می‌شه تنظیمش کرد.
در ضمن یه سایتی که می‌خواد ۱۰۰ تا کاربر همزمان رو پوشش بده، و همچین load ای روش باشه، معمولاً از بیش از یک سرور استفاده می‌کنه و در نتیجه یهو ده‌ها هزار درخواست به یه سرور نمیاد که کم بیاره.



نمیشه گفت بهترین روشه کدوم
بهترین روش روشی هست که پرفرومنس بالاتری داشته باشه
البته performance درسته که عامل مهمی هست، ولی تنها عامل تأیین کننده نیست! مسائلی مانند قابلیت انعطاف، قابلیت توسعه، و هزینه‌ی پیاده‌سازی هم مهم هستند.

alavigold
یک شنبه 06 اردیبهشت 1394, 15:17 عصر
سپاس از همه دوستان که نظرات و تجربیات خودشون رو گفتم، دارم توی رفرنسهای دیگه ی هم این موضوع رو پیگیری میکنم و همین جا نتیجه رو اعلام میکنم تا دوستان دیگه ای که مثل خودم براشون سئوال بوده که بهترین روش ذخیره سازی تصاویر چی هست در برنامه نویسی آشنا بشن!
بااحترام

m.esmaeilzadeh
یک شنبه 06 اردیبهشت 1394, 18:33 عصر
بهترین کار ذخیره سورس فایل داخل یک دایرکتوری و بیرون root اصلی سایت و فراخوانی تصاویر یا فایل ها با یک فایل واسط مثلا image.php است !!!
برای اینکه مدام کاربران رکوئست ندن و بخوان اون عکس رو بسازن باید cache کنید ...