آپلود فایل در PHP به همراه محدودیت در سایز و نوع فایل (عکس , ویدیو …) در سرور از قابلیت های بسیار مهم و کاربردی در وب است.
در این آموزش میبینیم که چگونه فایل هایی با سایز مشخص شده و نوع (فرمت) خاص را آپلود کنیم. همه مراحل به صورت قدم به قدم در قالب کد های قابل فهم در اختیار شما قرار می گیرد.
ساخت اسکریپت ساده آپلود فایل در PHP
قبل از ادامه با کد های PHP , یک فرم HTML داخل قسمت body با enctype “multipart/form-data
” ایجاد می کنیم . اول از همه یک اسکریپت ساده php می نویسیم و بعد محدودیت های حجم و نوع فایل را اضافه می کنیم.
1 2 3 4 |
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <br /><br /> <input type="submit" value="submit" /> </form> |
حین آپلود فایل , همه داده فایل ها در آرایه سوپرگلوبال $_FILES
ذخیره می شود . این آرایه داده هایی مثل اسم فایل , نوع فایل , مکان موقتی فایل و همچنین سایز و ارور کد ها را ذخیره می کند.
می توانید با استفاده از کد زیر این آرایه سوپرگلوبال را بررسی کنید . این کد را اول کد html خود قرارا بدید و بعد از submit کردن نتیچه را ببینید
1 2 3 4 5 |
<?php echo "<pre>"; print_r($_FILES); echo "</pre>"; ?> |
بعد از بررسی این کد, شما دقیقا خواهید فهمید چه مقادیری در آرایه FILES وجود دارد .عکس زیر تصویر ساده ای از داده های این آرایه است.
اختصاص دادن خانه های آرایه به متغییرها
برای قدم بعدی آپلود فایل در PHP , من داده های هر خانه از آرایه سوپر گلوبال را به متغییرها اختصاص میدم. کد های قبلی را پاک کنید و این کد ها را به خطوط قبل از شروع html اضافه کنید.
1 2 3 4 5 6 7 8 9 10 11 |
<?php $name = $_FILES['file']['name']; $size = $_FILES['file']['size']; $type = $_FILES['file']['type']; $tmp_name = $_FILES['file']['tmp_name']; ?> |
بررسی اینکه فایل آپلود شده یا نه ؟
قدم بعدی این است که بررسی کنیم که آیا کاربر فایل را برای آپلود انتخاب کرده است یا نه . . اگر آره, پس ما فایل را داخل دایرکتری مورد نظر آپلود میکنیم.کد زیر را به بعد از کد بالا اضافه کنید.
1 2 3 4 5 6 7 |
if(isset($name)){ if(!empty($name)){ // file upload code goes here. }else{ echo "Please select a file"; } } |
کدهای آپلود فایل ذر PHP
به طور پیش فرض فایل های آپلود شده در مکان موقتی (temporary) ذخیره می شود. با استفاده از تابع move_uploaded_file
, فایل آپلود شده در مکان موقتی را با اسم واقعی به فولدر uploads/ انتقال می دهیم.
1 2 3 4 5 6 |
$location = 'uploads/'; if(move_uploaded_file($tmp_name, $location.$name)){ echo "uploaded"; }else{ echo "Error in uploading file"; } |
کد کامل و نهایی تا این مرحله
بعد از ترکیب تمام کد های کوتاه, کد نهایی به این شکل خواهد بود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php $name = $_FILES['file']['name']; $size = $_FILES['file']['size']; $type = $_FILES['file']['type']; $tmp_name = $_FILES['file']['tmp_name']; if(isset($name)){ if(!empty($name)){ $location = 'uploads/'; if(move_uploaded_file($tmp_name, $location.$name)){ echo "uploaded"; }else{ echo "Error in uploading file"; } }else{ echo "Please select a file"; } } ?> |
محدودیت حجم آپلود فایل در PHP
در این مرحله , مقدار حداکثری فایل قابل آپلود توسط فرم را مشخص میکنیم که ۲MB است و باید به صورت بایت نوشته شود.
1 |
$max_size = 2097152; |
این کد ها را در قسمت این کامنت //file upload code goes here اضافه کنید.
1 2 3 4 5 6 7 8 9 10 |
if($size<=$max_size){ $location = 'uploads/'; if(move_uploaded_file($tmp_name, $location.$name)){ echo "uploaded"; }else{ echo "Error in uploading file"; } }else{ echo "file size is more than maximum"; } |
محدودیت پسوند و نوع فایل آپلودی
قصد آپلود یک فایل تصویر را دارم و فقط اجازه آپلود عکس با پسوند jpg را به من میده. شما می توانید پسوند های زیاد دیگری هم اضافه کنید. اول از همه با کد زیر نوع فایل ها را فیلتر میکنم.
1 |
$ext = substr($name, strpos($name, '.') + 1); |
بعد از بررسی حجم حداکثری قابل آپلود , شرط if به مرحله چک کردن نوع قایل می رود بعد از بررسی صحت نوع فایل به مرحله بعدی می رسد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if(isset($name)){ if(!empty($name)){ if($size<=$max_size){ if(($ext == 'jpg' || $ext == 'jpeg')&&$type=='image/jpeg'){ $location = 'uploads/'; if(move_uploaded_file($tmp_name, $location.$name)){ echo "uploaded"; }else{ echo "Error in uploading file"; } }else{ echo "file should be jpg/jpeg"; } }else{ echo "file size is more than maximum"; } }else{ echo "Please select a file"; } } |
کد نهایی آپلود فایل در PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php $name = $_FILES['file']['name']; $size = $_FILES['file']['size']; $type = $_FILES['file']['type']; $tmp_name = $_FILES['file']['tmp_name']; $max_size = 1000000; $ext = substr($name, strpos($name, '.') + 1); if(isset($name)){ if(!empty($name)){ if($size<=$max_size){ if(($ext == 'jpg' || $ext == 'jpeg')&&$type=='image/jpeg'){ $location = 'uploads/'; if(move_uploaded_file($tmp_name, $location.$name)){ echo "uploaded"; }else{ echo "Error in uploading file"; } }else{ echo "file should be jpg/jpeg"; } }else{ echo "file size is more than maximum"; } }else{ echo "Please select a file"; } } ?> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"/> <br /><br /> <input type="submit" value="submit" /> </form> |
نکته : اگر هرگونه مشکلی در حین آپلود فایل مواجه شدید لطفا دایرکتری uploads را چک کنید که از قبل وجود داشته باشد .
سلام و درود . برای ذخیره فایل ها در دیتابیس میشه لطفا راهنمایی بفرمایید . با تشکر
سلام.
ستون رو از نوع text قرار بدید و فایل رو با file get contents بخونید و اون رو مثلا base64 encode کنید و بعد ذخیره کنید
نیاز به api نویسی دارم و باید method رو get کنم
این روش قابل انجام هست؟
سلام. برای آپلود فایل خیر باید post باشه
لطفا یه راه بگید…
آدرس محدودیت ۳۰۰۰ کاراکتری داره و بعضی کاراکترهای نامفهوم هم قابل پردازش نیستند و اگر هم ارسال کنید ممکنه فایلتون قابلیت اجرا نداشته باشه
بررسی کنید محدودیت ارسالتون چی هست اون رو رفع کنید
سلام من یه مشکله دیگه هم داشتم چجوری به کاربر این sooryy.gigfa.com/loading.gif گیف لود رو نشون بدم یعنی بزارم زیر اون دکمه سابمیت
لطفا کمکم کنید
سلام ببخشید چجوریم یتونم بعد از آپلود لینک رو به کاربر نشون بدم؟
لطفا کمکم کنید
سلام.
بعد move_uploaded_file شدن در این شرط که عبارت uploaded چاپ میشه میتونید ادرس رو به اینصورت لینک دار چاپ کنید
ببخشید کده خطا میده
https://uupload.ir/files/sfdb_2021-04-19_135958.png
ببیند من این کدی که گفتید رو دیدم درست بود : زیر اون کد چاپ کلمه uploaded گذاشتمش خطا میده
البته من جای اون site.com لینک سایت خودمو گذاشتم
اما بازم اخطار میده
ببخشید خیلی مزاحمتون میشم
سلام
وقتی نام فایل فارسی باشه بعد از اپلود به مشکل می خوره و نه قابل حذفه نه قابل باز کردن و داخل نام فایل علامت? هست چطور می تونم این مشکل رو رفع کنم
سلام. به اینصورت نام رو اوکی کنید
$name = $_FILES[‘photo’][‘name’];
$unicode = iconv(‘windows-1256’, ‘utf-8’, $name);
سلام بهتر از این نمیشد اما این اکمان وجود داره که فقط
عکس نباشه و هرگونه فایل امکان داشته باشه ؟
ممنون میشم جواب بدین 🥺🥺
سلام.
این شرط رو اگر بردارید میتونید هر فایلی آپلود کنید
if(($ext == ‘jpg’ || $ext == ‘jpeg’)&&$type==’image/jpeg’)
سلام حسن جان درست شد ممنونم نقطه رو نگذاشته بودم بدون پسوند حل شد فقط حسن عزیز یه سوال تو هاست رایگان برای دیدن htaccess میگن تو فایل منیجر گزینه setting رو بزنید و … ولی من گزینه setting نمیبینم این به خاطر رایگان بودنشه ؟
بهتره هر سوالی دارید وقت بزارید گوگل کنید حتما به نتیجه میرسید
سلام دوباره حسن جان تو نوت پد تایپ کردم ولی پسوندش رو باید حذف کنم ؟هم با پسوند txt و هم بدون پسوند رو لوکال جواب نمیده چیکار باید کرد سپاس از راهنمایی ها تون
سلام حسن جان وقتی اسم پوشه ای در سایتم رو با اسلش مینویسم با جزئیات میاره چیکار کنیم که مانع نشون دادن اطلاعات بشیم وقتی کسی اسم پوشه مثلا upload رو بزنه چیزی نشون نده با تشکر
سلام.
ساخت فایل .htaccess در آن پوشه و قرار دادن کد options -indexes
سلام حسن جان این کارهای مربوط به mime و تغییر نام فایل و چک کردن سایز رو انجام دادم فقط راجع به تگ file match که تو سایته بود چیزی تو سایتای ایرانی توضیح نداده فکر کنم همین مربوط به جلوگیری از اجرا شدن فایل php باشه درسته ؟ حالا یه توضیحی حسن جان راجع به force type و filematch برامون بده حسن جان چطوری استفاده کنیم اصلا یه مقاله برای امنیت وبسایت بزار مهندس شفیعی نازنین
حالا بدون این file match امنیت آپلودر برقرار میشه ؟ تشکر از راهنمایی ها تون
سلام حسن جان یه راهنمایی کنید لطفا در خصوص پیامی که دادم با تشکر سوال بود پاسخ نبود
موضوع گسترده ای هست و در کامنت نمیشه کامل توضیح داد.
$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
سلام حسن جان هکر ها چطوری فایل php رو در قالب عکس تو سایت آپلود میکنند من برای امتحان کردن تو سایتم چطوری اینکار رو انجام بدم اگه پسوند رو به exam.php.png تغییر بدم درسته یا کار پیچیده ایه میشه راهنمایی کنید با سپاس فراوان از شما دوست عزیز تر از جان
سلام. افزونه tamper data و دستکاری اطلاعات فایل در هنگام آپلود
حالا حسن جان من برای امنیت آپلودر سایتم از mime_type استفاده میکنم آیا این گزینه mime فرمت واقعی php رو تشخیص میده یا گول میخوره و image بر میگردونه اگه گول میخوره چطوری باید جلوی اینکار رو گرفت
سلام
با تشکر از مطالبتون.
همونطور که میدونید اگه کسی در url ادرس پوشه عکس رو بگیره میتونه اونارو مشاهده و دانلود کنه ، چیکار کنم که کسی نتونه اونا رو ببینه چون عکس کدملی شون برای احراز هویت هست.
با تشکر.
سلام . برای جلوگیری از اینکار شما باید از .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 مواجه خواهد شد (پسوند فایل ها هم در اخر کد میتوانید ویرایش یا اضافه کنید . اگر قصد دارید از نمایش یک سری عکس ها در یک دایرکتری خاص جلوگیری کنید ، کد را در همان دایرکتری قرار بدید)
روش های دیگری هم برای جلوگیری از دسترسی به عکس های شما است که بستگی به سیستم احراز هویت شما دارد و باید دید به چه صورت است تا پیشنهاداتی در این مورد ارایه بدم ولی روش بالا کار شما رو را میندازه
موفق باشید