آموزش آپلود فایل در PHP

دسته‌ها : آموزش, پی اچ پی علی میرزائی 56 دیدگاه‌ها

اسکریپت آپلود فایل در php

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

مرحله اول، تعریف یک فرم html با ۲ ورودی از نوع های file و submit که در قطعه کد زیر آورده شده:

HTML

<form action="" method="post" enctype="multipart/form-data">
	<input type="file" name="files[]" multiple="multiple" accept="image/*">
	<input type="submit" value="آپلود کن!">
</form>

قطعه کد بالا، چند بخش مهم داره که این فرم رو از فرم های ساده دیگه متمایز میکنه. یکی از این موارد تعریف ویژگی enctype با مقدار multipart/form-data که مشخص میکنه این فرم مرتبط با کنترل آپلود. همچنین، input اول حتما باید از نوع file در نظر گرفته بشه و با تعریف ویژگی های multiple (ورودی همزمان از چند فایل) و accept (محدود سازی نوع فایل مورد قبول)، میشه چند تنظیم ساده رو به فرم اضافه کرد.

مشخص که این فرم، قرار یک سری داده رو با متد post ارسال کنه. بنابراین مرحله بعدی کار اختصاص داره به دریافت اطلاعات و پردازش اونها که برای انجام این کار نیاز به استفاده از کدنویسی php داریم:

PHP

<?php
$valid_formats = array("jpg", "png", "gif", "zip", "bmp"); // فایل های مجاز جهت آپلود
$max_file_size = 1024*100; //100 کیلوبایت
$path = "uploads/"; // فولدر مقصد
$count = 0; // متغیر شمارنده

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
	// حلقه  $_FILES برای اجرای تمامی فایل ها
	foreach ($_FILES['files']['name'] as $f => $name) {     
	    if ($_FILES['files']['error'][$f] == 4) {
	        continue; // پرش از فایل در صورت یافتن خطا
	    }	       
	    if ($_FILES['files']['error'][$f] == 0) {	           
	        if ($_FILES['files']['size'][$f] > $max_file_size) {
	            $message[] = "$name از حجمی بالاتر از مقدار مجاز برخوردار است.";
	            continue; // پرش در صورت داشتن حجم غیر مجاز
	        }
			elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){
				$message[] = "$name از فرمت فایلی مجاز برای آپلود برخوردار نیست.";
				continue; // پرش در صورت داشتن فرمت غیر مجاز
			}
	        else{ // اگر هیچ خطایی یافت نشد، فایل را منتقل کن!
	            if(move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path.$name)) {
	            	$count++; // شمارنده تعداد فایل های آپلود شده
	            }
	        }
	    }
	}
}
?>

توضیح متغیرهای استفاده شده در بخش بالا:

  • متغیر valid_formats: آرایه ای از فرمت های مورد قبول که در شرط های پایین تر استفاده شده.
  • متغیر max_file_size: محدود سازی حجم آپلود
  • متغیر path: آدرس پوشه مقصد که فایل ها در اونجا آپلود میشن.
  • متغیر count: شمارنده تعداد فایل های ارسالی در یک آپلود.

توضیح بقیه دستورات، در متن کدها کامنت گذاری شده و میتونید وظیفه هر خط رو در محل خودش مطالعه کنید.

تا اینجا، دیگه کار ارسال فایل ها تموم شده. فقط برای گام آخر باید پیغام وضعیت آپلود رو که در قطعه کد بالا مشخص کردیم، چاپ کنیم: (برای انجام این کار، میتونید از کد زیر در بالا یا پایین فرم html استفاده کنید.)

PHP

<?php
# پیغام خطا
if (isset($message)) {
	foreach ($message as $msg) {
		printf("<p class='status'>%s</p></ br>\n", $msg);
	}
}
# پیغام موفقیت آمیز بودن بارگذاری
if($count !=0){
	printf("<p class='status'>%d فایل با موفقیت اضافه شد.</p>\n", $count);
}
?>

منبع : دنیای وردپرس و برنامه نویسی

برای راحتی کار، کدهای هر 3 مرحله رو در قالب یک اسکریپت پیوست کردیم که میتونید اون رو در محیط هایی مثل wamp یا xampp تست کنید.

دیدگاه کاربران در مورد این نوشته

  1. با سلام :
    بابت مطلب مفیدتون خیلی ممنون زیاد دنبال همچین چیزی میگشتم
    فقط یه سوال :
    میخوام موقع گرفتن خروجی پیغام به جای تعداد فایل اسم فایل رو بزنه ممنون میشم آموزشش رو قرار بدین

    توسط siyavash پاسخ

    1. سلام، مشکلی نیست! بخش چاپ پیغام موفقیت آمیز رو به صورت زیر تغییر بدید:

      if($count !=0){
      	foreach ($_FILES['files']['name'] as $prin_name) {
      		printf("<p class='status'>%s با موفقیت اضافه شد</p></ br>\n", $prin_name);
      	}
      }

      توسط علی میرزائی پاسخ

  2. لطفا جواب سوال بالا رو بدید. ممنون

    توسط مهدی پاسخ

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

    توسط مهدی پاسخ

  4. سلام
    من خیلی استفاده کردم
    ممنونم

    توسط سهیل صادق بیان پاسخ

    1. قابلی نداشت سهیل جان {گل}

      توسط علی میرزائی پاسخ

  5. خوب بود

    توسط نقشه برداری پاسخ

  6. خوب بود

    توسط طرحی وب سایت پاسخ

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

    توسط طرحی سایت پاسخ

  8. مرسی لطف کردین خیلی مفید بود

    توسط دانلود پاسخ

  9. سلام
    داداش علی
    یه سوال داشتم در مورد وردپرس
    من یه شرط داخل وردپرس می خواهم که دو تا تصویر اولم رو سایز 300 در 300 نمایش یده و بقیه رو 80 در 80 و هر موقع که تصویر جدید گذاشتم جایگزین بشه
    مثل این تصویر :
    http://static.farskids.co/1.jpg

    توسط محمد حسین پاسخ

    1. سلام
      آقا علی چی شد ؟
      چنین شرطی وجود داره یا نه؟

      توسط محمد حسین پاسخ

    2. سلام،
      راه حلی که الآن به ذهنم میرسه استفاده از دو کوئری در صفحه است. به این صورت که:
      1- مقدار posts_per_page رو در کوئری اول 2 بذارید و در داخل حلقه از تصویر شاخص 300 استفاده کنید.
      2- در کوئری دوم، posts_per_page رو به تعداد دلخواه تنظیم کنید و به offset مقدار 2 بدید. (لازم به ذکر نیست که در این حلقه تصویر شاخص رو باید روی 80 تنظیم کنید.)

      توسط علی میرزائی پاسخ

      1. دستت درد نکنه داداشی
        میشه یه لطفی کنی و کدش رو بذاری اینجوری متوجه نمی شم ؟
        ایشالا اومدی شیراز جبران کنم

        توسط محمد حسین پاسخ

  10. دوباره سلام
    این دکمه choose file هیچ راهی نداره که اسمش عوض بشه!!!
    مرسی

    توسط فرشته پاسخ

  11. آموزش مفیدی بود ممنون

    توسط سایت عکس پاسخ

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

    توسط فرشته پاسخ

    1. اون فایل اکسل رو یه جایی آپلود کنید و در آخر لینکش رو برای کاربران قرار بدید.

      توسط علی میرزائی پاسخ

  13. وای ببخشید من انقد سوال میپرسم
    من آخه هنو دارم کلاس برنامه نویسی میرم زیاد وارد نیستم

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

    توسط فرشته پاسخ

    1. اگه منظورتون لینک دانلود که میتونید از آدرس فایل استفاده کنید. در غیر این صورت توضیح کاملتری بدید.

      توسط علی میرزائی پاسخ

  14. یه مشکل دیگه!!
    من مثلا دوبار میخام این فایل رو آپلود کنم اما بار دوم over write میشه روی فایل اول
    و من نمیخام این اتفاق بیفته
    میخام مثل یه آرایه همه فایلا بمونه تو پوشم!
    چیکار کنم!!

    توسط فرشته پاسخ

    1. یه راه حل ساده، استفاده از تابع Date یا Time بین رشته name و path در تابع move_uploaded_file.
      به عنوان مثال:
      move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path.date("M_j_Hms").$name)

      توسط علی میرزائی پاسخ

  15. یه چیز دیگه
    من تو سی پنلم پوششو بذارم؟
    تو خود فایل public_html??
    یا توی پ.شه ای که فایل مورد نظرم توشه؟؟ آخه فایلای من پوشه پوشه و به صورت مجزاس

    توسط فرشته پاسخ

    1. من دقیقا نمیدونم که مورد استفاده شما کجاست! اما اگه قرار به صورت یک صفحه مجزا از این اسکریپت استفاده بشه، میتونید از روش فایل در public_html استفاده کنید.

      توسط علی میرزائی پاسخ

  16. سلام
    ممنون بابت فایل مفیدتون
    من یه مشکلی دارم اونم اینه که میخام این آپلود فایل رو تو صفحه ی مشتریانم بذارم تا یه فایل اکسل رو آپلود کنن
    تا اینجاش مشکلی ندارم
    اما نمیدونم چرا رو css اش مشکل دارم یعنی کلا از جاش تکون نمیخوذه ا اینکه تنظیمات css رو هم تغییر میدم
    نمیدونم مشکلش چیه
    اگه لازمه کدمو براتون بفرستم تا ببینید؟؟
    ممنون میشم

    توسط فرشته پاسخ

    1. سلام،
      فک میکنم یه جا از مقدار auto در پروپرتی margin استفاده شده. ممکنه مشکلتون از اون باشه.
      در هر صورت، استایلی که در این اسکریپت پیوست شده، بیشتر جنبه آزمایشی داره و حتما لازم نیست که عینا از اون استفاده کنید.

      توسط علی میرزائی پاسخ

  17. سلام آقا علی
    یه سوال داشتم ؟
    آقا شما پلیری میشناسید که فرمت OGG رو بتونه داخل سایت وردپرسی پخش کند ؟
    خودم دارم فقط mp3 رو جواب میده ؟

    توسط محمد حسین پاسخ

    1. سلام،
      تگ audio در html5، این پسوند رو قبول میکنه:
      http://tiny.alimir.ir/D1
      با اینحال میتونید افزونه زیر رو هم امتحان کنید:
      http://tiny.alimir.ir/BL/

      توسط علی میرزائی پاسخ

  18. میشه بگید کارش چیه؟

    توسط سهیل پاسخ

    1. از عنوان مشخص، با استفاده از این آموزش میتونید فایل ها رو با کمک php در یک هاست ذخیره کنید.

      توسط علی میرزائی پاسخ

  19. با تشکر مطلب جالبی بود

    توسط استخر پیش ساخته پاسخ

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

    توسط یاسر داودفر پاسخ

دیدگاه خود را بیان کنید