سلام دوستان
من یه پروژه دارم که پذیرش باید از فرد با usb camera عکس بگیره و ذخیره کنه
حالا دیتایی که camera به من میده به صورت base64 هست؛ و هر عکس حدودا یک صفحه A4 کد هست که من خط اولش رو میذارم :
data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQw
خب من میتونم برای هر فرد همین متن رو ذخیره کنم به عنوان عکسش و بعد با قرار دادن این کد داخل src تگ img بهش نمایش بدم ولی خواستم بدونم این کار منطقی هست یا نه؟ یعنی من بیام حجم دیتابیسم رو ببرم بالا بهتره یا عکس کاربرهارو به صورت فایل آپلود کنم؟
@hamed70.2011
قطعا واکشی یک تصویر از دیتابیس بصورت base64 مجموع سربار بیشتری برای سرور شما به همراه داره. چون درخواست میاد به وب سرور شما میرسه. از وب سرور به وب اپلیکیشن (مثلا لاراول) میرسه. وب اپلیکیشن از دیتابیس محتوا رو میگیره داخل خودش نگه میداره و بعد از پردازش های لازم return میکنه.
اما در حالت فایل، درخواست ها صرفا وارد لایه وب سرور میشن و در همون لایه هم پاسخ داده میشن. یعنی serve کردن فایل ها بصورت مسقتیم توسط وب سرور انجام میشن و اصلا درخواست به وب اپلیکیشن نمیرسه و دیتابیستون هم در این خصوص درگیر نمیشه.
@hbr
غیر از موضوع فوق، دلایل خیلی زیاد دیگه ای هم وجود داره که اولویت با استفاده بصورت فایل هست. مثلا یکیش اینکه بصورت میانگین حجم یک تصویر یکسان در حالت base64 تا حدود ۳۳ درصد بیشتر از حالت باینری (فایل) هست! دوم اینکه در حالت base64 و ذخیره در دیتابیس شما از نعمت Caching محروم میشید و با هر بار رفرش صفحه توسط یک کاربر باید کل محتوا رو از دیتابیس دریافت کنید و پهنای باندتون رو درگیر کنید و .... اما در حالت فایل خود مرورگرها در درخواست اول فایل تصویر رو Cache میکنند. در کنار همین موضوع آپشن CDN ها هم مطرح میشه که در حالت base64 استفاده ازش فایده چندانی نداره.
در کنار این ها بعضی مرورگرها همچنان از base64 پشتیبانی مناسبی ندارند. پردازش و نمایش محتوای base64 برای کاربران پر معونه تره و در آخر اینکه برای رمزنگاری هم اشاره کردید راهکارهای خیلی بهتر و حرفه ای تری وجود داره و جایی ندیدم که این روش رو بعنوان یک راهکار اولیه معرفی بکنند.
پس فقط زمانی به درد میخوره روش base64 که عکسی مثل عکس پروفایل و یا مثلا تعدادی مدارک شخصی بخواد ذخیره شه...
اگه یک عکس باشه مثلا عکس پروفایل کاربری اشکالی نداره ولی اگه مثلا میخواین یک آلبوم عکس درست کنید باید فایل ذخیره کنید...
مثلا 1000 مقاله رو میخواین در یک صفحه به کاربر نمایش بدین....
@hbr
با این گزاره های فوقتون هم اصلا موافق نیستم و نمیفهمم چه ارتباطی با قضیه داره و چرا باید ۱۰۰۰ تا مقاله رو تو یک صفحه نمایش بدیم اصلا و کی گفته در این حالت عجیب و غریب کدوم راهکار بهتره...؟ 🤔
چیزی که بیشتر رایج هست استفاده از base64 برای آیکون ست های کوچک یا لوگوهای کوچک و ... استفاده میشه که مثلا بتونیم مستقیم از طریق اعمال تغییرات در css و background-image آیکون رو تغییر بدیم ونیاز نباشه فایل جداگانه هم روی سرور آپلود بشه و ...
باز هم پیشنهاد میکنم راجع به موضوع سرچ بزنید. نتایج زیادی براشون وجود داره. مثلا:
https://www.davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/
https://stackoverflow.com/questions/522897/base-64-encode-vs-loading-an-image-file#:~:text=Base64%20encoding%20makes%20the%20file,then%20cached%20by%20the%20browser.
https://www.startups.com/community/questions/561/should-our-photo-sharing-app-use-base64-strings-or-files-using-urls-to-display
با سلام اگه یک عکس باشه مثلا عکس پروفایل کاربری اشکالی نداره ولی اگه مثلا میخواین یک آلبوم عکس درست کنید و یا فرضا یکسری مقالات رو پشت سرهم به صورت کاشی کاشی در بیارین باید اسم عکس رو در فیلد عکس ذخیره کنید و موقع بازیابی عکس مقاله مورد نظر رو از محل ذخیره سازیش واکشی کنید.
پس فقط زمانی به درد میخوره روش base64 که عکسی مثل عکس پروفایل و یا مثلا تعدادی مدارک شخصی بخواد ذخیره شه
اما برای مورد دومی که مثال زدم روش base64 اصلا روش مناسبی نیست(به دلیل سرباری که برای تحلیل نمایش عکس به کار میره مثلا 1000 مقاله رو میخواین در یک صفحه به کاربر نمایش بدین مثل همین سایت راکت بخش مقالاتش و یا دوره هاش ) و باید عکس رو روی سرور ذخیره کنید و موقع واکشی فقط اسم عکس رو از فیلد عکس بخونید و با توجه به مسیرش به کاربر نمایش بدین.
در ضمن برای ذخیره سازی عکس پروفایل و یا مدارک شخصی کاربر(مثل شناسنامه و یا کارت ملی و...) روش base64 به نظرم مناسب هست چون میتونید این عکس های حساس رو رمزنگاری بکنید و داخل دیتابیس ذخیره کنید.
پاسخ خیلی مشخصی شاید نشه به این سوال داد و بسته به شرایط و نیازتون میتونید از هر کدوم از روش ها استفاده کنید. ولی به نظر شخصی من اگر بصورت فایل ذخیره کنید و فقط اسم و مسیرش رو در دیتابیس ذخیره کنید بهتره.
هم از نظر Performance و هم از سرعت و میزان درگیری منابع سرور مثل RAM و ...
@mhyeganeh
اگه داده هاتون محرمانه باشه بهتره به صورت کد ذخیره شه که بشه رمزنگاریش کرد مثل اون چیزی که گفتم ولی اگه عمومی هست بهتره که اسمش و مسیرش ذخیره شه.
از نظر منابع سیستم هم فقط کلاینت رو درگیر میکنه چون سرور کد رو ارسال میکنه و این کلاینت هست که اونو جهت نمایش پردازش میکنه.
ممنونم از پاسخ کاملت دوست عزیز
الآن به طور کلی برای من این سوال مطرحه که جدای از بحث محرمانگی تصویر اگر ما فقط یک عکس رو در نظر بگیریم واکشی کد تصویر از دیتابیس فشار بیشتری به سرور میاره یا واکشی کردن از یک directory روی سرور؟
البته فکر می کنم سوالم خیلی تخصصی هست و کسی تستش نکرده باشه 🤔
@hamed70.2011
قطعا واکشی یک تصویر از دیتابیس بصورت base64 مجموع سربار بیشتری برای سرور شما به همراه داره. چون درخواست میاد به وب سرور شما میرسه. از وب سرور به وب اپلیکیشن (مثلا لاراول) میرسه. وب اپلیکیشن از دیتابیس محتوا رو میگیره داخل خودش نگه میداره و بعد از پردازش های لازم return میکنه.
اما در حالت فایل، درخواست ها صرفا وارد لایه وب سرور میشن و در همون لایه هم پاسخ داده میشن. یعنی serve کردن فایل ها بصورت مسقتیم توسط وب سرور انجام میشن و اصلا درخواست به وب اپلیکیشن نمیرسه و دیتابیستون هم در این خصوص درگیر نمیشه.
@hbr
غیر از موضوع فوق، دلایل خیلی زیاد دیگه ای هم وجود داره که اولویت با استفاده بصورت فایل هست. مثلا یکیش اینکه بصورت میانگین حجم یک تصویر یکسان در حالت base64 تا حدود ۳۳ درصد بیشتر از حالت باینری (فایل) هست! دوم اینکه در حالت base64 و ذخیره در دیتابیس شما از نعمت Caching محروم میشید و با هر بار رفرش صفحه توسط یک کاربر باید کل محتوا رو از دیتابیس دریافت کنید و پهنای باندتون رو درگیر کنید و .... اما در حالت فایل خود مرورگرها در درخواست اول فایل تصویر رو Cache میکنند. در کنار همین موضوع آپشن CDN ها هم مطرح میشه که در حالت base64 استفاده ازش فایده چندانی نداره.
در کنار این ها بعضی مرورگرها همچنان از base64 پشتیبانی مناسبی ندارند. پردازش و نمایش محتوای base64 برای کاربران پر معونه تره و در آخر اینکه برای رمزنگاری هم اشاره کردید راهکارهای خیلی بهتر و حرفه ای تری وجود داره و جایی ندیدم که این روش رو بعنوان یک راهکار اولیه معرفی بکنند.
پس فقط زمانی به درد میخوره روش base64 که عکسی مثل عکس پروفایل و یا مثلا تعدادی مدارک شخصی بخواد ذخیره شه...
اگه یک عکس باشه مثلا عکس پروفایل کاربری اشکالی نداره ولی اگه مثلا میخواین یک آلبوم عکس درست کنید باید فایل ذخیره کنید...
مثلا 1000 مقاله رو میخواین در یک صفحه به کاربر نمایش بدین....
@hbr
با این گزاره های فوقتون هم اصلا موافق نیستم و نمیفهمم چه ارتباطی با قضیه داره و چرا باید ۱۰۰۰ تا مقاله رو تو یک صفحه نمایش بدیم اصلا و کی گفته در این حالت عجیب و غریب کدوم راهکار بهتره...؟ 🤔
چیزی که بیشتر رایج هست استفاده از base64 برای آیکون ست های کوچک یا لوگوهای کوچک و ... استفاده میشه که مثلا بتونیم مستقیم از طریق اعمال تغییرات در css و background-image آیکون رو تغییر بدیم ونیاز نباشه فایل جداگانه هم روی سرور آپلود بشه و ...
باز هم پیشنهاد میکنم راجع به موضوع سرچ بزنید. نتایج زیادی براشون وجود داره. مثلا:
https://www.davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/
https://stackoverflow.com/questions/522897/base-64-encode-vs-loading-an-image-file#:~:text=Base64%20encoding%20makes%20the%20file,then%20cached%20by%20the%20browser.
https://www.startups.com/community/questions/561/should-our-photo-sharing-app-use-base64-strings-or-files-using-urls-to-display
مرسی تو ضیحاتت خیلی مفید بود
و من باز یه سوال برام پیش اومد
ببین خودتم میدونی برای اینکه من عکس یه نفر رو ذخیره کنم (حالت base 64) یه فیلد به رکورد خودش اضافه می کنم و وقتی می خوام اطلاعات فرد رو بگیرم خب عکسش رو هم دارم پس نیاز نیست مجدد به دیتابیس وصل بشم که فشار دو چندانی به سرور بیاد اما اگه عکس فرد رو به عنوان فایل ذخیره کنم علاوه بر دیتابیس باید فایل رو هم لود کنم؛ در مورد این نظرت چیه؟؟
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟