• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در نامگذاری فایلهای عکس کاربران در سایت
#1
بسم الله...
من چندین ماه قبل یه پروژه انجام دادم...توی این پروژه انواع و اقسام پوسترها و تصاویر آپلود میشد که همه شون توی یک پوشه آپلود میشدن...عکس کاربران عضو سایت هم توی یک پوشه ی دیگه....
اون موقع فرمولی رو برای خودم درنظر گرفته بودم که مثلا MD5 id کاربری که توی سایت ثبت شده یا پوستری که ثبت شده رو به عنوان نام فایل اون عکس درنظر میگرفتم و به اون اسم ذخیره اش میکردم... اما توی ویرایش کردن گاها پیش میومد که اون فایل رو جایگزین یک فایل دیگه میکرد و قاعدتا میدیدیم عکس یک کاربر عضو شده یا تصویر یک پوستر عوض شده....

اگه بخوایم صرفا نام اصلی عکس رو هم درنظر بگیریم که با توجه به اینکه توی یک فولدر آپلود میشن ممکن بود بخاطر شباهت نام جایگزین یک عکس دیگه بشه....

جدیدا ساختن فولدر روی هاست رو یاد گرفتم و به نظرم این روش بهتریه که برای هر کاربری که عضو میشه یه فولدر ساخته بشه و عکسش با همون اسم واقعی توی اون فولدر ذخیره بشه....
اما مشکلی که در این پروژه دارم اینه که چندین ماهه دارن باهاش کار میکنن و اطلاعات زیادی ریخته شده و عوض کردن مدل ذخیره سازی کار رو دچار مشکل میکنه....
میخواستم ببینم پیشنهاد شما چیه برای اینکار و اینکه فرم خاصی رو بهم پیشنهاد بدین که عکس هارو بر اساس اون ذخیره کنم توی دیتا بیس....که شباهت اسمی هم پیش نیاد...

ببینین یه راهی پیدا کردم بگین درسته؟
قبلا اینجوری بود که نام تصاویر در یک فیلدی در دیتابیس ذخیره میشد و مثلا اگه مسیر فایل این باشه:
کد پی‌اچ‌پی:
Images/users/name.jpg 
عبارت name.jpg در داخل دیتابیس ذخیره میشد و با آدرس images/users/نام فایل ، اون فایل رو فراخوانی میکردم...
الان به این روش رسیدم برای جلوگیری از شباهت نامها
کد پی‌اچ‌پی:
$dir=strtotime("now");
    
mkdir('./images/users/'.$dir,0775); 
توی این مسیر یک پوشه ایجاد میشه و بعد با دستور زیر
کد پی‌اچ‌پی:
$src=$dir."/".$image['name']; 
مقدار $src رو در داخل دیتابیس ذخیره میکنم و بدون مشکل هم فراخوانی میشه...نظرتون چیه؟
بنده طعم ايمان را نمي چشد، تا اينكه دريابد آنچه اتفاق نيفتاده است نمي شد كه اتفاق بيفتد؛و آنچه شده و اتفاق افتاده است,نمي شد كه نشود و اتفاق نيفتد....حضرت علي(ع)
  پاسخ
تشکر شده توسط :
#2
نقل قول:میخواستم ببینم پیشنهاد شما چیه برای اینکار و اینکه فرم خاصی رو بهم پیشنهاد بدین که عکس هارو بر اساس اون ذخیره کنم توی دیتا بیس....که شباهت اسمی هم پیش نیاد...
خب ببین آلگوریتمی بهتر از این نیست که برای هر کاربر یه فولدر در نظر بگیری و بعد نام فایل تصاویرشون رو به بدون تکرار (منحصر/unique) تغییر بدی. من نمیدونم از چه تابعی استفاده کردی که مشکلی برات دفعه اول پیش اومد . خودمم تاحالا نخواستم چنین کاری کنم ولی از توضیح این تابع http://php.net/manual/en/function.uniqid.php مشخصه که شناسه های منحصربفرد میده. نهایتش میتونی باز چک کنی که اگر شناسه ای که داد نام یک تصویر بود یبار دیگه شناسه جدید بده.

یه سوال دارم، چرا میخوای name.jpg رو در دیتابیست ذخیره کنی؟!
غایب
  پاسخ
تشکر شده توسط :
#3
خب یه فیلد دارم به اسم photo که توش نام عکس رو ذخیره میکنم....
موقعی هم که بخوام فراخوانی کنم مسیرش رو اینجوری مشخص می کنم مثلا:
کد پی‌اچ‌پی:
echo "<img src=images/users".$row['photo']." />"
بنده طعم ايمان را نمي چشد، تا اينكه دريابد آنچه اتفاق نيفتاده است نمي شد كه اتفاق بيفتد؛و آنچه شده و اتفاق افتاده است,نمي شد كه نشود و اتفاق نيفتد....حضرت علي(ع)
  پاسخ
تشکر شده توسط :
#4
نیازی نیست. دیگه سخت ترین کار ممکن بیرون کشیدن یک آواتار از بین صد عکسه. اونم کافیه اسم عکس avatar باشه. اصلاً نیازی نیست نام عکسی در دیتابیس ذخیره بشه. خیلی راحت میشه کنترل کرد تصاویر رو بدون اینکه در دیتابیس قرار بگیرن. توابع واسه اینکار زیاده.
غایب
  پاسخ
تشکر شده توسط :
#5
خب فقط بحث آواتار نیست.... این سایت کارش گذاشتن مجموعه پوسترهای مختلفه که اطلاعات خاصی نسبت به هرکدوم نگهداری میشه.... تصاویر اخبار، تصاویر یادداشت ها، تصاویر کاربران، تصاویر یادداشتهای کاربران وخیلی چیزهای دیگه...
بنده طعم ايمان را نمي چشد، تا اينكه دريابد آنچه اتفاق نيفتاده است نمي شد كه اتفاق بيفتد؛و آنچه شده و اتفاق افتاده است,نمي شد كه نشود و اتفاق نيفتد....حضرت علي(ع)
  پاسخ
تشکر شده توسط :
#6
نقل قول:خب فقط بحث آواتار نیست.... این سایت کارش گذاشتن مجموعه پوسترهای مختلفه که اطلاعات خاصی نسبت به هرکدوم نگهداری میشه.... تصاویر اخبار، تصاویر یادداشت ها، تصاویر کاربران، تصاویر یادداشتهای کاربران وخیلی چیزهای دیگه...
به این دقت کن.

کد:
root
  +users
    +id
      +avatars
      +news photos
      +notes photos
      +...
متوجه منظورم شدی؟ خب تو اینطوری هروقت بخوای تصویری از یادداشت کاربری رو بدست بیاری کافیه آدرس دقیق دایرکتوری اون تصویر رو بدی.
غایب
  پاسخ
تشکر شده توسط : webnevesht
#7
راستی حواست به فایلهایی که چند پسوند دارن باشه.
مثلا یک فایل با اسم pic.php.jpg میتونه خطرناک باشه.
اگر دقت کرده باشید در بعضی سایتها و مکانهای آپلود میان و مثلا نقطهء پسوندهای اضافی رو با آندرلاین جایگزین میکنن، یا روشهای دیگری.
البته اگر اسم رو خودتون بسازید که مشکلی نیست.
ضمنا طبیعتا این داستان و خطر موقعی هست که بشه به تصاویر آدرس مستقیم وبی داد. یعنی اگر تصاویر (و بطور کلی فایلهای آپلود شده) خارج از www یا در دیتابیس ذخیره شده باشن، این خطر وجود نداره. هرچند بنده توصیه نمیکنم که به این خاطر بیاید و فایلها رو در خارج از www یا در دیتابیس ذخیره کنید. جلوگیری از این خطر به روشهای دیگر کار سختی نیست.
  پاسخ
تشکر شده توسط : webnevesht cyletech
#8
(۱۳۹۱ خرداد ۲۱, ۰۹:۴۳ ب.ظ)cyletech نوشته:
نقل قول:خب فقط بحث آواتار نیست.... این سایت کارش گذاشتن مجموعه پوسترهای مختلفه که اطلاعات خاصی نسبت به هرکدوم نگهداری میشه.... تصاویر اخبار، تصاویر یادداشت ها، تصاویر کاربران، تصاویر یادداشتهای کاربران وخیلی چیزهای دیگه...
به این دقت کن.

کد:
root
  +users
    +id
      +avatars
      +news photos
      +notes photos
      +...
متوجه منظورم شدی؟ خب تو اینطوری هروقت بخوای تصویری از یادداشت کاربری رو بدست بیاری کافیه آدرس دقیق دایرکتوری اون تصویر رو بدی.
میشه بیشتر توضیح بدی؟ چطوری باید بفهمونم که کدوم عکس ماله چه پستیه؟ و اینکه مزیت این کار چیه؟

در صورت استفاده از روش ذخیره در دیتابیس راه حلتون برای مشکلی که گفتم چیه و آیا روشی که رفتم خوبه؟
بنده طعم ايمان را نمي چشد، تا اينكه دريابد آنچه اتفاق نيفتاده است نمي شد كه اتفاق بيفتد؛و آنچه شده و اتفاق افتاده است,نمي شد كه نشود و اتفاق نيفتد....حضرت علي(ع)
  پاسخ
تشکر شده توسط :
#9
نقل قول:میشه بیشتر توضیح بدی؟ چطوری باید بفهمونم که کدوم عکس ماله چه پستیه؟ و اینکه مزیت این کار چیه؟
ببین دایرکتوری درختی بهترین و استاندارد ترین راهه که هیچ حجم اضافه ای رو اشغال نمیکنه. ممکنه فولدر خالی باشه یا لااقل توش چیزی هست مثل عکس.
خب تو هنوز داستان رو نگرفتی. ببین یه فولدر توی روت میسازی که توش قراره کارهای کاربرا ذخیره بشه. داخل اون برای هر کاربر یه فولدر به اسم آیدیش (ID نه یوزرنیم - به علت راحتی کار و بهینه بودن از نظر تعداد کاراکتر های کم) میسازی. داخل اون، هر قسمت که قراره عکسی داشته باشه، مثل فیس بوک، بخش آلبوم، کاور، آواتار و ... با عناوین مشخص مثل cover و album و ... میسازی. حالا توی هر کدوم باز اگر قرار باشه تفکیک بشه مثل تصاویر مطلب ها، باز فولدر میسازی به شناسه(ID) اون مطلب و داخلش تصاویر رو قرار میدی. حتی اگر قرار باشه تاریخ و زمان ارسال عکس هم بدست بیاری کافیه اسم عکس رو مثلاً بصورت "timestamp.jpg" بنویسی. ( timestamp یه سری عدده غیر تکراریه که مشخص کننده همه چیز در مورد زمان و تاریه هست ).
به همین راحتی.

نقل قول:در صورت استفاده از روش ذخیره در دیتابیس راه حلتون برای مشکلی که گفتم چیه و آیا روشی که رفتم خوبه؟
اینجا ما وظیفه داریم بهترین و استاندارد ترین راه هارو اول پیشنهاد کنیم بعد اگر طرف هرطور قادر به انجامش نبود راه خودش رو نقد یا در صورت امکان تصحیح کنیم.
راه شما فقط یه چیز خاص داره. اونم ذخیره سازی اسامی تصاویر بصورت تاریخه. البته توابعی که استفاده کردید اصلاً درست نیست ولی کلاً همون کاری رو میکنه که گفتم. روش شما اصلاً خوب نیست. چون در آینده خودتون به فکر توسعه بیوفتید متوجه این مشکل بزرگ میشید.
غایب
  پاسخ
تشکر شده توسط : Reza
#10
این روشی که علیرضا خان گفت خیلی خوبه و میشه گفت اصولیه اما یه چیزم من بگم .

شما میتونی یه پرامتر دیگه ای هم مد نظر داشته باشی برای نامگذاری آواتارهای کاربران .
طبعاً هر کاربر یکی و فقط یک آواتار داره .
شما میای مثلاً md5 یوزر نیم کاربر رو برای اسم آواتار استفاده میکنی . خب این اشکال پیش میاد که شاید md5 دو رشته تکراری در بیاد که گویا همین هم برات پیش اومده .
حالا پیشنهاد من اینه به جای ساختار شاخه ای که علیرضا گفت id + md5 یزور نیم رو استفاده کنی .

مثلاً نام کاربری یکی از اعضا reza هست md5ش میشه bb98b1d0b523d5e783f931550d7702b6
پس شما حالا یه عکس داری به این صورت bb98b1d0b523d5e783f931550d7702b6.jpg
اگه از شناسه استفاده کنی مثلاً شناسه 19 اینطوری استفاده کن
کد:
19-bb98b1d0b523d5e783f931550d7702b6.jpg
دیگه این تابلوئه که هیچ وقت تکراری در نمیاد.

البته یه نکته دیگه اینکه فقط تنها از md5 خالی استفاده نکن یه سالت هم بزن تنگش Big Grin

نقل قول:راستی حواست به فایلهایی که چند پسوند دارن باشه.
مثلا یک فایل با اسم pic.php.jpg میتونه خطرناک باشه.
گویا همه جا نگاهتون امنیتی است به مسائل !
باید مسئول انتظامات کنکور میشدیدBig Grin

برای حل این مشکل نباید به صرف فرمت فایل ، نوع فایل رو تشخیص داد!
من برای این مشکل از سه فیلتر عبورش میدم .
فیلتر اول چک کردن فرمت که مثلاً jpg , gpeg , gif , png باشه
فیلتر دوم چک کردن نبود رشته هایی چون .php .htaccess .php3 .js .php4
فیلتر سوم چک کردم file type که از mimesهای مجاز باشه image/jpeg , image/pjpeg , image/png , image/x-png , image/gif
و در آخر هم مثل همین دوستمون اسم عکس رو تغییر میدم.
حله استاد؟
وبلاگ rezaonline.net/blog
سفارش برنامه نویسی reza.biz
Php , mysql , postgresql , redis , Yii and ... Cool
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان