آپلود فایل در php – نحوی نامگذاری

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

خوب یکی از موارد ساده ای که توی آپلود فایل همه با اون برخورد می کنیم این هست که چجوری فایل هایی رو که تو هاست آپلود می کنیم نامگذاری کنیم. خصوصاْ اگه در حال نوشتن یک framework یا CMS باشیم این مورد خیلی ساده رو باید خیلی جدی بگیریم.

شاید شما و بقیه برای حل این مشکل راهکارهایی رو که در زیر بیان می کنم انجام داده باشید ولی هر کدوم اونها یک مشکلی داره که به ترتیب براتون توضیح میدم.

۱ – استفاده از نام فعلی فایل

شاید راه اول قرار دادن اسم خود فایل باشه ٬ یعنی اگه فایل۱.jpgرو که آپلود می کنید٬ توی هاست هم اسمش همون۱.jpgباشه. خوب نامگذاری فایل ها به این صورت میتونه باعث overwrite شدن فایل ها بشه ٬ مثلاْ توی یک سایت چندتا یوزر دارن فایل آپلود می کنن و خوب اگه این فایل۱.jpgروی کامپیوتر یوزر اولی باشه و آپلود بشه و بعد یوزر دومی هم به صورت اتفاقی اون فایل رو داشته باشه و آپلود بکنه اونوقت دومین فایل آپلود شده جایگزین اولی میشه . شاید فکر کنید که این اتفاق به ندرت میوفته ولی تجربه نشون داده که این اتفاق به کررات میوفته (گرچه ما همیشه باید جوری برنامه نویسی بکنیم که حتی ۱ بار هم این مورد پیش نیاد.).

۲ – استفاده از نامهای غیر تکراری

راه دوم این هست که نام فایل رو بعد از آپلود یه چیز بزاریم که تکراری نباشه ٬ مثلاْ استفاده از تابعtime() یا تابعuniqueid()که اولی timestamp رو بر می گردونه و دومی یه عددی غیر تکراری (که دقتش از اولی بیشتره) ٬ این روش مشکل روش قبلی رو نداره اما یه مشکل دیگه داره و اون هم duplication یا تکراری بودن فایل هاس ٬ چون فایل ها هر بار که آپلود میشن با یک نام جدید توی هاست قرار میگیرن ٬ پس اگه مثلاْ فایل۱.jpgرو ۱۰ بار تو هاستمون آپلود کنیم دقیقاْ ۱۰ تا کپی از فایل۱.jpgداریم که هر کدوم یه اسمی دارن.تو این روش هاستمون به سرعت پر میشه.

۳ – استفاده از الگوریتم md5

راه سوم که هیچ کدوم از مشکلات ۲ روش قبلی رو نداره اینه که فایل ها رو با استفاه از الگوریتم md5 هش کنیم و اون هش رو به عنوان نام فایل قرار بدیم. مطمئنا با تابعmd5()آشنا هستید. این تابع یک رشته رو به عنوان ورودی میگیره و خروجی رو یک رشته هش شده ۳۲ کاراکتری بر می گردونه.(نکتش اینجاس که اگه شما رشته متنی به طول ۱ رمان رو به اون بدید و بعد بیاید حتی ۱ کاراکتر از متن اون رمان رو تغیر بدید و اون رو دوباره به md5 بدید ٬ خروجی اول با دومی متفاوته!  یعنی دقت در حد تیم ملی 😃).
اما ما برای اینکار باید از تابعmd5_file()بجایmd5()استفاده کنیم ٬ فرقشون اینه کهmd5_file() ورودیش بجای متن ٬ فایل هست و خروجی که بر می گردونه بر اساس محتوای اون فایل هست.
بنا براین اگه از این روش استفاده بکنیم دیگه نه فایل هایی که نام های یکسانی دارن بر روی هم overwrite میشن و نه دیگه یک فایل با چند نام توی هاستمون ذخیره میشه.
دقت کنید که هش کردن بر اساس محتوای فایل انجام میشه و نه اسم اون (پس اگه فایلتون یه عکس هست و اون عکس رو ابعادش رو تغییر بدید ایم فایلتن عوض میشه حتی اگه اون تغییر به اندازه ۱ پیکسل باشه.)

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *