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

اسکریپت آپلود فایل در 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. دمت گرم کارت درسته خ داییش این همه سایت اومدن این اپلود چندگانه رو توضیح دادن هیچکدومشون درست حسابی مصل شما توضیح ندادن هموشن فقط ی=میخواستن یه مطلبی زاشته باشند شما اومدی قشنگ توضیح دادی که فهمیدم چی به چیه دمت گرم

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

  2. با سلام

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

    1- نام محصول
    2- تعداد محصول
    3-قیمت نقدیمحصول
    4- قیمت چکی محصول

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

    میشه راهنمایی کنید چطوری این کار را انجام بدم.

    توسط آزادی پاسخ

  3. سلام بنده به کمک اموزش شما فایل رو آپلود می کنم میشه بگید چطوری اون رو دیتابییس ذخیره کنم (آدرسش رو میگم)

    توسط reza_yki پاسخ

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

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

  4. سلام من همین جوری که شما کد نوشتید انجام میدم ولی نمیشه به جای مشخصات فایل کدی که نوشتم رو نشون میده چیکار کنم؟

    توسط mavis پاسخ

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

    توسط glizoviliz پاسخ

  6. با سلام
    من با ۲ کد ساده زیر می خواهم فایل های zip , rar , 7z را upload کنم اما نمیشه.
    هیچ error خاصی هم نمیده و صفحه خالی نشون میده و اگر هم error بده میگه index فایل موجود نیست.(وقتی تست کردم دیدم اصلا عمل post انجام نمیشه)
    در ضمن :
    من از wamp 64 bit اخرین نگارش استفاده می کنم(تو درایو d نصب شده)(mime.type را نیز چک کردم مشکلی نداشت)(تنظیمات upload در php.ini هم چک کردم مثلا از نظر حجم و زمان و temp dir هیچ مشکلی نیست).
    ویندوزم هم 10 enterprise 64 bit است.
    انتی ویروس هم eset smart security 9 است.
    گفتم شاید این اطلاعات بدرد بخوره.

    دوستان خواهش می کنم در این مورد راهنمایی کنید.
    با تشکر

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

  7. با درود و سپاس از مطالب مفیدتون
    سوالی داشتم و اینکه میخوام در هر سطر از جدولم ک با کدهای htmlساختم یعنی در هر tdیک عکس آپلود بشه چطور میتونم اینکارو انجام دهم سپاسگذارم اگر پاسخم رو بدید

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

  8. با سلام
    چطور بعد این که فایل را اپلود کرد ادرس فایل را زیرش چاپ کند
    ممنون میشم کد اون را بدید

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

  9. سلام
    ممنون از اسکریپت خوبتون
    من میخوام که اسم فایل به $id ذخیره بشه … در صورت امکان تغییر کد را برام بنویسید …
    با تشکر از شما

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

    1. سلام. در دیدگاه های قبلی، نمونه کدی مشابه رو نوشتم و با کمی تغییر میتونید ازش استفاده کنید.

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

  10. سلام
    چطور می توان که نام فایل را در زمان آپلود در این فرم عوض کرد.
    یعنی برای مثال نام فایل را تغییر به id کنه ؟؟؟؟؟
    لطفا راهنمایی کنید.

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

    1. سلام، در دیدگاه های قبلی توضیح داده شده.

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

    2. سلام
      من هم مشکل شما را دارم … لطفا راهنمایی کنید

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

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

    توسط حسن پاسخ

    1. سلام، اگه مقدار متغیر $max_file_size رو زیاد کنید، نباید مشکلی به وجود بیاد. دقیقا چه پیغامی رو نمایش میده؟!؟!

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

      1. ممنون از جوابتون …. هیچ اروری نمیده اصلا هیچ واکنشی نشون نمیده نه ارور حجم زیاد نه ارور پشتیبانی نکردن ار فرمتی من تابع ره به چند مدل مثل $max_file_size = 1024*1024; تغییر دادم ولی بازم درست کار نمیکرد حجمی که وارد میکنیم مگه بر حسب بایت نیست؟؟؟ممنون میشم راهنمایی کنید

        توسط حسن پاسخ

      2. من هر چی اعداد رو عوض میکنم بازم مشکل داره میشه لطف کنید شما یه تغییری بدین که حداکثر 10 مگ بیشتر فایل قبول نکنه و در اختیارم قرار بدید .. ممنون میشم

        توسط حسن پاسخ

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

    توسط چاپ فوری کارت ویزیت پاسخ

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

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

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

    توسط دستگاه حضور و غیاب پاسخ

    1. بستگی به نیازهای شما داره! این یه اسکریپت خیلی سادست و بیشترین هدفش اینه که مکانیزم اطلاعات پست شده رو در PHP (توسط تابع move_uploaded_file) معرفی کنه. (و چون توابع استاندارد هستند، فک نمیکنم به مشکل امنیتی برخورد کنید.)

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

  15. سلام داداش خوبی ..واقعا عالی بود..
    توجه !!! من میخواستم یه اپلودر که با فرمت html یا htm باشه و فقط یه فایل داشته باشه….
    اگه تونستی برای یکی بساز خیلی لازممه….
    ممنون میشم اگه کمکم کنی …مرسی……

    توسط kogo پاسخ

  16. سلام
    ممنون بابت سورس کد مفیدتون.می شه بگید چطوری می شه که بعد آپلود آدرس دقیق تصاویر در دست باشه که بتونیم در دیتابیش ذخیره کنیم؟؟

    توسط رضا پاسخ

  17. خوب بود

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

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