آپلود فایل در PHP

  • آپدیت شده در تاریخ

آپلود فایل توسط PHP

آپلود فایل در PHP به همراه محدودیت در سایز و نوع فایل (عکس , ویدیو …) در سرور از قابلیت های بسیار مهم و کاربردی در وب است.

در این آموزش میبینیم که چگونه فایل هایی با سایز مشخص شده و نوع (فرمت) خاص را آپلود کنیم. همه مراحل به صورت قدم به قدم در قالب کد های قابل فهم در اختیار شما قرار می گیرد.

 

ساخت اسکریپت ساده آپلود فایل در PHP

قبل از ادامه با کد های PHP , یک فرم HTML داخل قسمت body با enctype “multipart/form-data” ایجاد می کنیم . اول از همه یک اسکریپت ساده php می نویسیم و بعد محدودیت های حجم و نوع فایل را اضافه می کنیم.

حین آپلود فایل , همه داده فایل ها در آرایه سوپرگلوبال $_FILES ذخیره می شود . این آرایه داده هایی مثل اسم فایل , نوع فایل , مکان موقتی فایل و همچنین سایز و ارور کد ها را ذخیره می کند.

می توانید با استفاده از کد زیر این آرایه سوپرگلوبال را بررسی کنید . این کد را اول کد html خود قرارا بدید و بعد از submit کردن نتیچه را ببینید

بعد از بررسی این کد, شما دقیقا خواهید فهمید چه مقادیری در آرایه FILES وجود دارد .عکس زیر تصویر ساده ای از داده های این آرایه است.

 

اختصاص دادن خانه های آرایه به متغییرها

برای قدم بعدی آپلود فایل در PHP , من داده های هر خانه از آرایه سوپر گلوبال را به متغییرها اختصاص میدم. کد های قبلی را پاک کنید و این کد ها را به خطوط قبل از شروع html اضافه کنید.

بررسی اینکه فایل آپلود شده یا نه ؟

قدم بعدی این است که بررسی کنیم که آیا کاربر فایل را برای آپلود انتخاب کرده است یا نه . . اگر آره, پس ما فایل را داخل دایرکتری مورد نظر آپلود میکنیم.کد زیر را به بعد از کد بالا اضافه کنید.

کدهای آپلود فایل ذر PHP

به طور پیش فرض فایل های آپلود شده در مکان موقتی (temporary) ذخیره می شود. با استفاده از تابع move_uploaded_file, فایل آپلود شده در مکان موقتی را با اسم واقعی به فولدر uploads/ انتقال می دهیم.

کد کامل و نهایی تا این مرحله

بعد از ترکیب تمام کد های کوتاه, کد نهایی به این شکل خواهد بود.

محدودیت حجم آپلود فایل در PHP

در این مرحله , مقدار حداکثری فایل قابل آپلود توسط فرم را مشخص میکنیم که ۲MB است و باید به صورت بایت نوشته شود.

این کد ها را در قسمت این کامنت //file upload code goes here اضافه کنید.

محدودیت پسوند و نوع فایل آپلودی

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

بعد از بررسی حجم حداکثری قابل آپلود , شرط if به مرحله چک کردن نوع قایل می رود بعد از بررسی صحت نوع فایل به مرحله بعدی می رسد.

کد نهایی آپلود فایل در PHP

نکته : اگر هرگونه مشکلی در حین آپلود فایل مواجه شدید لطفا دایرکتری uploads را چک کنید که از قبل وجود داشته باشد .

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۲۸)

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

  1. پدرام ۱۴ دی ۱۴۰۱

    سلام و درود . برای ذخیره فایل ها در دیتابیس میشه لطفا راهنمایی بفرمایید . با تشکر

    پاسخ
    1. حسن شفیعی ۱۵ دی ۱۴۰۱

      سلام.
      ستون رو از نوع text قرار بدید و فایل رو با file get contents بخونید و اون رو مثلا base64 encode کنید و بعد ذخیره کنید

      پاسخ
  2. نامشخص ۷ خرداد ۱۴۰۱

    نیاز به api نویسی دارم و باید method رو get کنم
    این روش قابل انجام هست؟

    پاسخ
    1. حسن شفیعی ۸ خرداد ۱۴۰۱

      سلام. برای آپلود فایل خیر باید post باشه

      پاسخ
      1. نامشخص ۹ خرداد ۱۴۰۱

        لطفا یه راه بگید…

        پاسخ
      2. حسن شفیعی ۱۳ خرداد ۱۴۰۱

        آدرس محدودیت ۳۰۰۰ کاراکتری داره و بعضی کاراکترهای نامفهوم هم قابل پردازش نیستند و اگر هم ارسال کنید ممکنه فایلتون قابلیت اجرا نداشته باشه
        بررسی کنید محدودیت ارسالتون چی هست اون رو رفع کنید

        پاسخ
  3. محمد مهدی شجاعیان ۳۰ فروردین ۱۴۰۰

    سلام من یه مشکله دیگه هم داشتم چجوری به کاربر این sooryy.gigfa.com/loading.gif گیف لود رو نشون بدم یعنی بزارم زیر اون دکمه سابمیت
    لطفا کمکم کنید

    پاسخ
  4. محمد مهدی شجاعیان ۳۰ فروردین ۱۴۰۰

    سلام ببخشید چجوریم یتونم بعد از آپلود لینک رو به کاربر نشون بدم؟
    لطفا کمکم کنید

    پاسخ
    1. حسن شفیعی ۳۰ فروردین ۱۴۰۰

      سلام.
      بعد move_uploaded_file شدن در این شرط که عبارت uploaded چاپ میشه میتونید ادرس رو به اینصورت لینک دار چاپ کنید

      پاسخ
      1. محمد مهدی شجاعیان ۳۰ فروردین ۱۴۰۰

        ببخشید کده خطا میده
        https://uupload.ir/files/sfdb_2021-04-19_135958.png
        ببیند من این کدی که گفتید رو دیدم درست بود : زیر اون کد چاپ کلمه uploaded گذاشتمش خطا میده

        پاسخ
      2. محمد مهدی شجاعیان ۳۰ فروردین ۱۴۰۰

        البته من جای اون site.com لینک سایت خودمو گذاشتم
        اما بازم اخطار میده
        ببخشید خیلی مزاحمتون میشم

        پاسخ
  5. امیر ۲۸ فروردین ۱۴۰۰

    سلام
    وقتی نام فایل فارسی باشه بعد از اپلود به مشکل می خوره و نه قابل حذفه نه قابل باز کردن و داخل نام فایل علامت? هست چطور می تونم این مشکل رو رفع کنم

    پاسخ
    1. حسن شفیعی ۲۸ فروردین ۱۴۰۰

      سلام. به اینصورت نام رو اوکی کنید

      $name = $_FILES[‘photo’][‘name’];
      $unicode = iconv(‘windows-1256’, ‘utf-8’, $name);

      پاسخ
  6. ارمیا ۱۶ فروردین ۱۴۰۰

    سلام بهتر از این نمیشد اما این اکمان وجود داره که فقط
    عکس نباشه و هرگونه فایل امکان داشته باشه ؟
    ممنون میشم جواب بدین 🥺🥺

    پاسخ
    1. حسن شفیعی ۱۶ فروردین ۱۴۰۰

      سلام.
      این شرط رو اگر بردارید میتونید هر فایلی آپلود کنید
      if(($ext == ‘jpg’ || $ext == ‘jpeg’)&&$type==’image/jpeg’)

      پاسخ
  7. محمود رنجبر ۶ بهمن ۱۳۹۹

    سلام حسن جان درست شد ممنونم نقطه رو نگذاشته بودم بدون پسوند حل شد فقط حسن عزیز یه سوال تو هاست رایگان برای دیدن htaccess میگن تو فایل منیجر گزینه setting رو بزنید و … ولی من گزینه setting نمیبینم این به خاطر رایگان بودنشه ؟

    پاسخ
    1. حسن شفیعی ۶ بهمن ۱۳۹۹

      بهتره هر سوالی دارید وقت بزارید گوگل کنید حتما به نتیجه میرسید

      پاسخ
  8. محمود رنجبر ۶ بهمن ۱۳۹۹

    سلام دوباره حسن جان تو نوت پد تایپ کردم ولی پسوندش رو باید حذف کنم ؟هم با پسوند txt و هم بدون پسوند رو لوکال جواب نمیده چیکار باید کرد سپاس از راهنمایی ها تون

    پاسخ
  9. محمود رنجبر ۶ بهمن ۱۳۹۹

    سلام حسن جان وقتی اسم پوشه ای در سایتم رو با اسلش مینویسم با جزئیات میاره چیکار کنیم که مانع نشون دادن اطلاعات بشیم وقتی کسی اسم پوشه مثلا upload رو بزنه چیزی نشون نده با تشکر

    پاسخ
    1. حسن شفیعی ۶ بهمن ۱۳۹۹

      سلام.
      ساخت فایل .htaccess در آن پوشه و قرار دادن کد options -indexes

      پاسخ
  10. محمود رنجبر ۲ بهمن ۱۳۹۹

    سلام حسن جان این کارهای مربوط به mime و تغییر نام فایل و چک کردن سایز رو انجام دادم فقط راجع به تگ file match که تو سایته بود چیزی تو سایتای ایرانی توضیح نداده فکر کنم همین مربوط به جلوگیری از اجرا شدن فایل php باشه درسته ؟ حالا یه توضیحی حسن جان راجع به force type و filematch برامون بده حسن جان چطوری استفاده کنیم اصلا یه مقاله برای امنیت وبسایت بزار مهندس شفیعی نازنین
    حالا بدون این file match امنیت آپلودر برقرار میشه ؟ تشکر از راهنمایی ها تون

    پاسخ
  11. محمود رنجبر ۲ بهمن ۱۳۹۹

    سلام حسن جان یه راهنمایی کنید لطفا در خصوص پیامی که دادم با تشکر سوال بود پاسخ نبود

    پاسخ
    1. حسن شفیعی ۲ بهمن ۱۳۹۹

      موضوع گسترده ای هست و در کامنت نمیشه کامل توضیح داد.

      $valid_mime_types = array(
      “image/gif”,
      “image/png”,
      “image/jpeg”,
      “image/pjpeg”,
      );
      if (in_array($_FILES[“file”][“type”], $valid_mime_types)) {
      $destination = “uploads/” . $_FILES[“file”][“name”];
      move_uploaded_file($_FILES[“file”][“tmp_name”], $destination);
      }

      این آموزش رو ببینید :
      https://docs.php.earth/security/uploading

      پاسخ
  12. محمود رنجبر نورآبادی ۲ بهمن ۱۳۹۹

    سلام حسن جان هکر ها چطوری فایل php رو در قالب عکس تو سایت آپلود میکنند من برای امتحان کردن تو سایتم چطوری اینکار رو انجام بدم اگه پسوند رو به exam.php.png تغییر بدم درسته یا کار پیچیده ایه میشه راهنمایی کنید با سپاس فراوان از شما دوست عزیز تر از جان

    پاسخ
    1. حسن شفیعی ۲ بهمن ۱۳۹۹

      سلام. افزونه tamper data و دستکاری اطلاعات فایل در هنگام آپلود

      پاسخ
      1. محمود رنجبر ۲ بهمن ۱۳۹۹

        حالا حسن جان من برای امنیت آپلودر سایتم از mime_type استفاده میکنم آیا این گزینه mime فرمت واقعی php رو تشخیص میده یا گول میخوره و image بر میگردونه اگه گول میخوره چطوری باید جلوی اینکار رو گرفت

        پاسخ
  13. ایمان ۲۳ شهریور ۱۳۹۶

    سلام
    با تشکر از مطالبتون.
    همونطور که میدونید اگه کسی در url ادرس پوشه عکس رو بگیره میتونه اونارو مشاهده و دانلود کنه ، چیکار کنم که کسی نتونه اونا رو ببینه چون عکس کدملی شون برای احراز هویت هست.
    با تشکر.

    پاسخ
    1. حسن شفیعی ۲۳ شهریور ۱۳۹۶

      سلام . برای جلوگیری از اینکار شما باید از .htaccess استفاده کنید . به اینصورت که در روت سایت خود (دایرکتری public_html )یک فایل .htaccess بسازید و (یا اگر دارید ویرایش کنید ) و این کدها رو اضافه کنید
      RewriteEngine on
      RewriteCond %{HTTP_REFERER} !^http://(www\.)?netparadis.com [NC]
      RewriteCond %{HTTP_REFERER} !^http://(www\.)?netparadis.*$ [NC]
      RewriteRule \.(jpg|jpeg|png)$ - [F]

      به جای netparadis.com آدرس سایت خودتون رو جایگزین کنید
      از این به بعد هرکس اقدام به باز کردن عکس ها از طریق url کند با خطای ۴۰۳ forbidden مواجه خواهد شد (پسوند فایل ها هم در اخر کد میتوانید ویرایش یا اضافه کنید . اگر قصد دارید از نمایش یک سری عکس ها در یک دایرکتری خاص جلوگیری کنید ، کد را در همان دایرکتری قرار بدید)

      روش های دیگری هم برای جلوگیری از دسترسی به عکس های شما است که بستگی به سیستم احراز هویت شما دارد و باید دید به چه صورت است تا پیشنهاداتی در این مورد ارایه بدم ولی روش بالا کار شما رو را میندازه

      موفق باشید

      پاسخ
دوره های آموزشی