۲۶ دی ۱۳۹۹
1159 بازدید
مقالات تصادفی
- چگونه در PHP مقادیر تکراری را از یک آرایه پاک کنیم؟ (تابع array_unique)
- آموزش تصویری و گام به گام تست نفوذ با کالی لینوکس
- ۱۰ روش برای جستجو در گوگل که کمتر کسی از آنها آگاه است!
- جدیدترین پسوندهای دامنه که از آنها چیزی نمی دانید
- با پیشرفتهترین رباتهای جهان آشنا شوید
- آشنایی با آپلود (upload) در PHP
- چرا رنگ عکسهای موبایلی شما عجیب است؟
- حافظهی کش پردازنده چیست و چگونه کار میکند؟
- آموزش کامل ۸ روش کپی فرمول در اکسل
- کارهای اشتباه برنامهنویسان که کاربران را کلافه میکند

ساختن یک فرم ارسال فایل برای بعضی سایت ها شاید خیلی ارزشمند و شاید برای سایت دیگری ارزش چندانی نداشته باشد. اما خیلی از سایت ها به یک فرم آپلود یا ارسال فایل نیاز دارند. در این قسمت به آموزش ساخت یک فرم آپلود فایل به وسیله کدهای html و php می پردازیم.
یک فرم ارسال فایل (Upload) ابتدا نیاز به فرم به وسیله تگ های html می باشد. این فرم شامل یک فیلد فایل و یک دکمه ارسال فرم (submit) دارد. کد html ما به شکل زیر می باشد:
<html>
<head>
<meta charset=utf-8" />
<title>فرم ارسال فایل</title>
</head>
<body>
<form action="index.php" method="post" enctype="multipart/form-data">
<b>Choose Your file:</b> <input name="file" type="file" /><br />
<input name="submit" type="submit" value="Upload" />
</form>
</body>
</html>
همانطور که مشاهده می کنید عنصر form ما دارای یک صفت به نام enctype می باشد که این صفت نوع مقادیر ارسالی را مشخص می کند. مقدار multipart/form-data برای ارسال مقادیر باینری به کار می رود (مقادیر باینری مانند محتویات فایل مورد ارسال).
از توضیح عناصر html خودداری می کنیم.
خروجی این قطعه کد به شکل زیر می باشد:
نوشتن اسکریپت ارسال فایل (upload)
نوبت به نوشتن کدهای php مربوط به فرم ارسال فایل می رسد. این کدها را درون همان فایل index.php که کدهای html قرار دارد می نویسیم (ارسال شدن فرم را توسط تابع isset() بررسی می کنیم). قطعه کد ما به شکل زیر می باشد:
<?php
if(isset($_POST['submit'])){
if($_FILES['file']['error'] == 0){
move_uploaded_file($_FILES['file']['tmp_name'], "upload/".$_FILES['file']['name']) or die("File can't upload");
echo "File uploaded successfully!!!";
}
else
echo "Upload can't complete because of error below:<br/>".$_FILES['file']['error'];
}
?>
در کد بالا ابتدا ارسال فرم توسط تابع isset() بررسی می شود و در صورت ارسال شدن کد ارسال فایل اجرا می شود.
دسترسی به تمام مشخصات فایل های ارسالی توسط متغیر $_FILES[] امکان پذیر است. شکل کلی استفاده از این تابع به شکل زیر است:
$_FILES[form_input_name][attribute]
این آرایه شامل دو پارامتر به صورت بالا می باشد. پارامتر اول نام فیلد فایل (که در کدهای html برابر با file قرار داده شد) می باشد و پارامتر دوم صفت مورد نظر برای فایل می باشد (در ادامه با دیگر صفات این آرایه آشنا خواهیم شد).
در بالا با استفاده از مقدار error از این آرایه وجود هرگونه خطا را بررسی کردیم و در صورت عدم وجود هرگونه خطایی با استفاده از تابع move_uploded_file() فایل ارسال شده را ذخیره کردیم و پیغام مناسب را نمایش می دهیم (با مقدار tmp_name در ادامه آشنا می شویم).
تابع move_uploaded_file()
همانطور که در مثال بالا مشاهده کردید این تابع برای ذخیره کردن فایل های ارسال شده توسط فرم های html استفاده می کنیم.
این تابع شامل دو پارامتر می باشد. پارامتر اول filename می باشد که نام فایل ارسال شده و پارامتر دوم محل ذخیره به علاوه نام فایل مورد نظر می باشد.
فایل هایی که توسط فرم های html به سرور ارسال می شوند تا زمانی که ذخیره شوند در temporary سرور قرار می گیرند. آدرس فایل درون temporary توسط آرایه $_FILES[][] قابل دریافت می باشد که برای پارامتر اول نام فیلد فایل را نوشته و برای پارامتر دوم (در آرایه $_FILES[][]) مقدار tmp_name را قرار می دهیم (در این مثال نام فیلد فایل برابر با file می باشد):
$_FILES[‘file’][‘tmp_name’];
پس شکل کلی استفاده از تابع move_uploaded_file() به شکل زیر می باشد:
move_uploaded_file(filename, destination);
آرایه $_FILES[][]
همانطور که پیش از این هم گفته شد این آرایه برای دسترسی به صفات فایل ارسال شده می باشد. این آرایه شامل مقادیر زیر می باشد:
$_FILES[‘file’][‘name’]:
دسترسی به نام فایل آپلود شده.
$_FILES[‘file’][‘type’]:
دسترسی به نوع و فرمت (format) فایل آپلود شده.
$_FILES[‘file’][‘tmp_name’]:
دسترسی به مسیر فایل در temporary سرور.
$_FILES[‘file’][‘error’]:
کد خطای ارسال فایل در صورت وجود.
$_FILES[‘file’][‘size’]:
سایز فایل آپلود شده برحسب بایت (Byte).
با استفاده از کد زیر تمام محتویات فایل ارسال شده را چاپ می کنیم:
<?php
if(isset($_POST['submit']))
print_r($_FILES['file'])
?>
خروجی:
حالا می خواهیم فرم ارسال ایمیل و اسکریپت را گسترش دهیم و فایل ارسال شده را ازجهاتی فیلتر کنیم تا از ارسال فایل های نامعتبر جلوگیری کنیم.
کد نهایی ما به شکل زیر می باشد که هم دارای کدهای html و هم دارای کدهای php می باشد:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>فرم ارسال فایل</title>
</head>
<body>
<?php
if(isset($_POST['submit'])){
$types = array("image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/x-png", "image/png");
if(!in_array($_FILES['file']['type'],$types))
echo "Your file isn't in allowed types!!!";
elseif($_FILES['file']['error'] > 0)
echo "Your file can't upload because of error below:<br/>".$_FILES['file']['error'];
elseif($_FILES['file']['size'] > 2000000)
echo "File size is more than allowed size!!!";
elseif(file_exists("upload/".$_FILES['file']['name']))
echo "File already exists!!!";
else{
move_uploaded_file($_FILES['file']['tmp_name'], "upload/".$_FILES['file']['name']) or die("File can't be copied!!!");
echo "<span style='color:darkgreen'>File uploaded successfully!!!</span><br/>";
echo "<b>File name:</b> ".$_FILES['file']['name']."<br/>";
echo "<b>File type:</b> ".$_FILES['file']['type']."<br/>";
$size = $_FILES['file']['size'] / 1000;
echo "<b>File size:</b> ".$size." kb <br/>";
echo "<b>File uploaded to:</b> 'upload/".$_FILES['file']['name']."'";
}
}
else{
echo "<form action='index.php' method='post' enctype='multipart/form-data'>
<b>Choose Your file:</b> <input name='file' type='file' /><br />
<input name='submit' type='submit' value='Upload' />
</form>";
}
?>
</body>
</html>
خروجی:
این کد را به شکلی نوشتیم که در صورت ارسال فایل اسکریپت را اجرا کند و در غیر این صورت فرم آپلود فایل را نمایش دهد.
فیلتر کردن داده ها و عدم اجازه به داده های نامعتبر در هر قسمت توضیح داده می شود:
$types = array("image/gif", "image/jpeg", "image/jpg", "image/pjpeg", "image/x-png", "image/png");
if(!in_array($_FILES['file']['type'],$types))
echo "Your file isn't in allowed types!!!";
در این قسمت انواع فرمت های مجاز برای فایل موردنظر را درون یک آرایه قرار داده و اگر فایل ارسالی جزء فرمت های مجاز نباشد (مثلا یک فایل موسیقی) خطایی نمایش داده می شود (این فرم ارسال فایل مخصوص تصاویر می باشد). با استفاده از تابع in_array() جست و جویی درون آرایه $types انجام می دهیم.
elseif($_FILES['file']['error'] > 0)
echo "Your file can't upload because of error below:<br/>".$_FILES['file']['error'];
با استفاده از این قطعه کد وجود هرگونه خطایی در ارسال را گزارش می دهیم.
elseif($_FILES['file']['size'] > 2000000)
echo "File size is more than allowed size!!!";
این قطعه کد حداکثر حجم مجاز برای فایل ارسال شده را بررسی می کند. حجم فایل برحسب بایت می باشد و 2000000بایت برابر با 2 مگابایت می باشد.
elseif(file_exists("upload/".$_FILES['file']['name']))
echo "File already exists!!!";
در این قسمت هم وجود فایلی با چنین نامی (از قبل) را بررسی می کنیم و اگر فایلی با چنین نامی از پیش وجود داشته باشد پیغام خطایی نمایش داده می شود.
else{
move_uploaded_file($_FILES['file']['tmp_name'], "upload/".$_FILES['file']['name']) or die("File can't be copied!!!");
echo "<span style='color:darkgreen'>File uploaded successfully!!!</span><br/>";
echo "<b>File name:</b> ".$_FILES['file']['name']."<br/>";
echo "<b>File type:</b> ".$_FILES['file']['type']."<br/>";
$size = $_FILES['file']['size'] / 1000;
echo "<b>File size:</b> ".$size." kb <br/>";
echo "<b>File uploaded to:</b> 'upload/".$_FILES['file']['name']."'";
}
اگر هیچ خطایی وجود نداشته باشد (قسمت های قبلی کد) این قسمت اجرا می شود. در این قسمت ابتدا فایل آپلود شده توسط تابع move_uploaded_file() به پوشه upload منتقل می شود و پیغام “فایل با موفقیت ارسال شد” نمایش داده می شود و پس از آن اطلاعات فایل ارسالی یعنی نام، فرمت، سایز و محل استقرار فایل را نمایش داده می شوند.