آموزش آپلود فایل در php
یکی از ویژگیهای فرمهای HTML، امکان آپلود یا ارسال فایل به سرور است. زبان برنامهنویسی php که در طراحی سایت بیشترین کاربرد را دارد، برای مدیریت فایلهای آپلود شده دستوراتی در اختیار برنامهنویسان قرار میدهد.
پیش از وارد شدن به بخش فنی و بررسی کدهای لازم برای آپلود فایل، آشنایی با اتفاقات پشت صحنه که در فرآیند آپلود رخ میدهد، آشنا خواهیم شد:
- ایجاد یک فرم HTML با فرمت متناسب که توانایی ارسال فایل به سرور را داشته باشد
- ایجاد یک فیلد برای انتخاب و آپلود فایل
- انتخاب فایل توسط کاربر
- ارسال فرم به سرور به همراه محتویات فایل انتخاب شده
- کپی شدن فایل آپلودی در مسیر موقتی توسط پردازشگر php
- پایان انتقال فایل به سرور و اجرا شدن کدهای برنامهنویسی
- بررسی صحت و شرایط فایل آپلودی توسط اسکریپت php
- انتقال فایل از مسیر موقتی به جایگاه اصلی
ایجاد فرم HTML با امکان ارسال فایل به سرور
فرمهایی که بنا است برای آپلود فایل به سرور استفاده شوند، میبایست صفت «enctype» معادل «multipart/form-data» را داشته باشند. صفت «enctype» مشخص میکند که اطلاعات فرم با چه فرمتی به سرور ارسال شود. در استانداردهای دیگر کدگذاری اطلاعات، روشی برای آپلود فایل به سرور مشخص نشده است. دو صفت دیگر «action» مسیر فایل php است که فایل آپلودی را دریافت میکند و صفت «method» که در هنگام آپلود فایل میبایست با post مقدار دهی شود:
1 2 3 |
<form action="upload.php" method="post" enctype="multipart/form-data"> <!-- fields --> </form> |
به سه ویژگی action، method و enctype دقت کنید.
- بیشتر بخوانید: روشهای GET و POST در فرم HTML
ایجاد فیلد انتخاب فایل
فیلد input از نوع file کار انتخاب فایل برای آپلود را بر عهده دارد. صفت name نام مجازی فایل آپلودی را مشخص خواهد کرد:
1 2 3 4 |
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="picture"> <input type="submit" value="آپلود فایل"> </form> |
اگر کدهای بالا را در یک فایل html ذخیره کنید، میبایست صفحهای شبیه تصویر زیر برای شما ایجاد شود:
هم اکنون میتوانید فایل مورد نظر خود را انتخاب کنید و روی دکمهی «آپلود فایل» کلیک کنید.
نکات امنیتی پیش از انتقال فایل
یکی از اشکالهای امنیتی جدی که ممکن است در برنامهنویسی سمت سرور رخ دهد، اجازه دادن به آپلود فایلهای اجرایی است. به عبارت دیگر اگر اسکریپت آپلود شما اجازهی آپلود فایلهایی با پسوند php را به مشتری بدهد، یک هکر میتواند با این اشکال امنیتی، کدهای مورد نظر خود را روی سرور شما آپلود کند و کنترل کامل آن را در دست بگیرد. بنابراین گام مهم پیش از آپلود فایل، بررسی امنیتی فایل آپلودی است.
بهترین روش برای این کار، ایجاد یک لیست سفید به جای لیست سیاه است. به عبارت دیگر اسکریپت شما تنها باید فایلهایی با چند پسوند محدود را بپذیرد. گزینههای احتمالی برای آپلود تصویر ممکن است مساوی «jpg,jpeg,gif,png» باشند.
بررسی صحت آپلود شدن فایل روی سرور
نکتهی مهم دیگری که میبایست به آن توجه نمود، بررسی صحت آپلود شدن فایل روی سرور است. به دلایل مختلف از جمله حجم بالا، اشکال در ارتباط اینترنتی، اشکالات امنیتی و سایر موارد ممکن است آپلود فایل با موفقیت همراه نباشد. در چنین شرایطی میبایست کاربر را از وضعیت موجود آگاه کنید و از او بخواهید که عملیات آپلود را مجددا با شرایط مناسب به انجام برساند.
انتقال فایل به شاخهی هدف
پس از بررسی دو مورد بالا، میبایست فایل را به شاخهی مقصد منتقل کنیم. هرچند انتقال فایل با دستورات معمول کپی و انتقال فایل امکانپذیر است، ولی برای امنیت بیشتر لازم است تا از دستور ویژهی این کار با نام move_uploaded_file استفاده کنیم.
کدهای زیر که اسکریپت بررسی امنیت و انتقال فایل آپلودی هستند را با نام upload.php روی سرور انتقال دهید. همچنین لازم است تا شاخهای با نام uploads در کنار این فایل ایجاد کنید تا امکان انتقال فایلها به این شاخه فراهم شود.
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 |
<?php $file = $_FILES[ "picture" ]; // بررسی آپلود شدن فایل if( $file[ 'error' ] !== UPLOAD_ERR_OK ) { echo 'رخداد خطا در هنگام آپلود فایل. لطفا مجددا تلاش نمایید'; return; } // گرفتن پسوند فایل $extension = pathinfo( $file[ 'name' ], PATHINFO_EXTENSION ); // تعریف پسوندهای مجاز برای آپلود $valid_extensions = array( 'jpg', 'jpeg', 'png', 'gif' ); // بررسی پسوند فایل با لیست سفید مجاز if( false === in_array( $extension, $valid_extensions ) ) { echo 'پسوند فایل انتخاب شده غیر مجاز است'; return; } // فایل به درستی آپلود شده است و پسوند آن هم مجاز است $destination = 'uploads/'; $filename = basename( $file[ 'name' ] ); // انتقال فایل با دستور مخصوص انتقال فایلهای آپلودی move_uploaded_file( $file[ 'tmp_name' ], $destination . $filename ); // نمایش پیام موفقیت آپلود echo 'آپلود فایل با موفقیت به انجام رسید'; |
همانگونه که در کد بالا مشاهده میکنید، مشخصات فایلهای آپلود شده توسط کاربر در متغیر سراسری FILES قابل دسترسی است. هر فایل آپلودی دارای اطلاعاتی است که عبارتند از: name، tmp_name، size، error و type. از اغلب موارد فوق در کدهای بالا استفاده شده است.
نکتهی امنیتی پایانی که میبایست مورد توجه باشد این است که به دلیل قابلیت دستکاری این اطلاعات توسط هکرها، اعتماد کردن ۱۰۰ درصد به موارد فوق به ویژه نام و نوع فایل، ممکن است سبب رخداد مشکل امنیتی برای سرور شود.
نکات پایانی
ایجاد یک فرم پیشرفته برای آپلود فایل نکتههای بسیار دیگری دارد. برای کسب اطلاعات بیشتر در مواردی مانند آپلود چندین فایل به صورت نامحدود، آپلود با استفاده از Ajax و خطاهای احتمالی در هنگام آپلود فایل میتوانید به راهنمای php مراجعه نمایید.
در مورد تنظیم پرمیشن پوشه آپلود چیزی ننوشتین
اگر تنظیمات هاست به درستی انجام شده باشد، نیازی به انجام کاری نیست
در شرایط خاصی هم که مشکلی روی هاست وجود داشته باشد، رفع آن خارج از محدودهی برنامهنویسی php است و به همین دلیل در این نوشته چیزی گفته نشده است
سلام.
اگر بخوام فایل pdf یا word رو در سایت بتونم آپلود کنم در قسمت کدها جایی که پسوند فایل نوشته شده باید چی بنویسم؟
وقتی پسوند های pdf , word رو مینویسم کاری انجام نمیشه
باید چه دستوری بنویسم؟
با سلام
پسوند فایلهای ورد doc و docx است و پسوند فایلهای pdf همان pdf است