آشنایی با آپلود (upload) در PHP

PHP   
6 اکتبر 2014   

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

یک فرم ارسال فایل (Upload) ابتدا نیاز به فرم به وسیله تگ های html می باشد. این فرم شامل یک فیلد فایل و یک دکمه ارسال فرم (submit) دارد. کد html ما به شکل زیر می باشد:

 

همانطور که مشاهده می کنید عنصر form ما دارای یک صفت به نام enctype می باشد که این صفت نوع مقادیر ارسالی را مشخص می کند. مقدار multipart/form-data برای ارسال مقادیر باینری به کار می رود (مقادیر باینری مانند محتویات فایل مورد ارسال).

از توضیح عناصر html خودداری می کنیم.

خروجی این قطعه کد به شکل زیر می باشد:

مثالی از آشنایی با آپلود در PHP

خروجی

نوشتن اسکریپت ارسال فایل (upload)

نوبت به نوشتن کدهای php مربوط به فرم ارسال فایل می رسد. این کدها را درون همان فایل index.php که کدهای html قرار دارد می نویسیم (ارسال شدن فرم را توسط تابع isset() بررسی می کنیم). قطعه کد ما به شکل زیر می باشد:

 

در کد بالا ابتدا ارسال فرم توسط تابع 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

خروجی

 

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

کد نهایی ما به شکل زیر می باشد که هم دارای کدهای html و هم دارای کدهای php می باشد:

 

خروجی:

آشنایی با آپلود در PHP

خروجی

این کد را به شکلی نوشتیم که در صورت ارسال فایل اسکریپت را اجرا کند و در غیر این صورت فرم آپلود فایل را نمایش دهد.

فیلتر کردن داده ها و عدم اجازه به داده های نامعتبر در هر قسمت توضیح داده می شود:

 

در این قسمت انواع فرمت های مجاز برای فایل موردنظر را درون یک آرایه قرار داده و اگر فایل ارسالی جزء فرمت های مجاز نباشد (مثلا یک فایل موسیقی) خطایی نمایش داده می شود (این فرم ارسال فایل مخصوص تصاویر می باشد). با استفاده از تابع in_array() جست و جویی درون آرایه $types انجام می دهیم.

 

 

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

 

 

این قطعه کد حداکثر حجم مجاز برای فایل ارسال شده را بررسی می کند. حجم فایل برحسب بایت می باشد و 2000000بایت برابر با 2 مگابایت می باشد.

 

 

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

 

اگر هیچ خطایی وجود نداشته باشد (قسمت های قبلی کد) این قسمت اجرا می شود. در این قسمت ابتدا فایل آپلود شده توسط تابع move_uploaded_file() به پوشه upload منتقل می شود و پیغام “فایل با موفقیت ارسال شد” نمایش داده می شود و پس از آن اطلاعات فایل ارسالی یعنی نام، فرمت، سایز و محل استقرار فایل را نمایش داده می شوند.