آپلود فایل در PHP

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

آپلود فایل با PHP

 

در این مقاله قصد داریم به زبانی ساده، نحوه آپلود و ذخیره یک فایل با زبان برنامه نویسی PHP را مورد بررسی قرار داده و با برخی ویژگی های این عملیات آشنا شویم.

در ابتدا باید یک فرم برای انتخاب و ارسال فایل به سمت سرور را در صفحه HTML خود ایجاد کنیم. این فرم مشابه سایر فرم هایی که در صفحات خود ایجاد میکنیم هستند با دو تفاوت اصلی

۱-  نوع enctype فرم

۲- نوع فیلد input

برای درک بهتر، ابتدا کد زیر را بررسی کنید.

 

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

دو تفاوت ذکر شده در بالا، در قطعه کد فوق کاملاً مشخص است: فیلد enctype از نوع multipart/form-data بوده و نوع فرمت فیلد ما file می باشد.

در پایان هم یک دکمه (Button) برای ارسال فرم در نظر گرفته شده است.

همانطور که مشخص هست پس از ارسال این فرم، اطلاعات فرم به فایلی به نام upload.php در کنار فایل حاوی فرم ارسال میشود. کار اصلی ما در داخل همین فایل است.

در زبان برنامه نویسی پی اچ پی یک متغیر سراسری (global) به نام $_FILES وجود دارد. این متغیر یک آرایه دو بعدی یا به نوعی یک ماتریس است که اطلاعات مربوط به فایل های آپلود شده را در خود نگه داری میکند؛ به عبارت دیگر اطلاعات مربوط به فایل (یا فایل های) انتخاب شده در فیلدهایی که نوعشان file هست را در هر ایندکس خود قرار میدهد.

ایندکس اول در متغیر $_FILES مشخص کننده فایل مورد نظر است که همان نام فیلد (ویژگی name در فیلد input) می باشد. ایندکس دوم نیز مشخصات فایل مورد نظر ماست.

به ازای هر فایل، پنج ویژگی در این متغییر ذخیره میشود که عبارتند از:

name : نام واقعی فایل آپلود شده (نام فایل روی سیستم کاربر)

type : فرمت MIME فایل را مشخص میکند (مثلا  image/jpeg)

tmp_name : مسیر و نام فایل آپلود شده که اکنون در پوشه موقت (temprary) سرور قرار دارد.

error : ارور برای آپلود فایل (۰ به معنای عدم ارور در آپلود فایل است.)

size : حجم فایل را به بایت (byte) نشان میدهد.

 

برای مثال اگر بخواهیم نام فایل آپلود شده در فرم را داشته باشیم میتوانیم از طریق $_FILES[“myFile”][“name”] به آن دسترسی داشته باشیم.

 

تابعی در زبان PHP به نام basename() وجود دارد. این تابع یک مسیر فایل را گرفته و نام فایل را به ما بازمیگرداند. این تابع یک پارامتر ورودی دوم نیز به صورت اختیاری و از نوع رشته دریافت میکند، در صورتی که فرمت فایل مساوی مقدار مشخص شده در این پارامتر باشد، فرمت (extension) فایل را از رشته بازگردانده شده حذف میکند.

 

حال برای دانستن نام فایل میتوانیم با صدا زدن تابع basename روی ویژگی اول فایل آپلود شده، نام را در یک رشته داشته باشیم.

 

ذخیره کردن فایل آپلود شده

حال که به فایل و اطلاعات آن دسترسی پیدا کردیم.، میخواهیم آنرا در مسیری دلخواه در سرور خود ذخیره کنیم.

در PHP یک تابع با نام move_uploaded_file() وجود دارد که دو پارامتر ورودی میگیرد:

– پارامتر اول، مشخص کننده مسیر و نام فایل فعلی است. (که در پوشه موقت سرور قرار دارد)

– و پارامتر دوم، مشخص کننده مسیر و نام فایل پس از ذخیره سازی است.

فرض میکنیم که میخواهیم فایل های آپلود شده را در مسیر files/ در کتار فایل کد نگه داری کنیم.

کد زیر عملیات انتقال و ذخیره فایل را برای ما انجام میدهد:

 

اکنون فایل ما با همان نام قبلی خودش در مسیر مورد نظرمان ذخیره شده است.

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

 

همانطور که میدانید فرآیند آپلود و ذخیره سازی فایل در سیستم اکثر اسکریپت های نوشته شده کمی پیچیده تر و کامل تر است.

مثلاً بهتر است فرمت فایل آپلود شده را بررسی کنیم.

بررسی فرمت فایل آپلود شده

برای این کار و با دسترسی به MIME Type فایل، میتوان به راحتی فرمت فایل را بررسی و فیلتر کرد. البته MIME Type مقادیر اضافه تری علاوه بر فرمت را داراست. (مثلا image/jpeg)

برای اینکه فرمت فایل را از روی نام آن داشته باشیم، میتوان از دو روش استفاده کرد.

در روش اول، نام فایل را با استفاده از کاراکتر “.” که به عنوان جداکننده نام فایل از فرمت آن استفاده میشود، تکه تکه کرده و سپس آخرین تکه را به عنوان فرمت فایل مورد نظر، برداریم. مشابه کد زیر:

 

روش دوم استفاده از تابع basename() روی MIME Type فایل است؛ در اینصورت تابع basename مقدار ورودی را به حالت یک آدرس فایل دیده و بخش آخر (که بعد از آخرین / است) را به عنوان خروجی بازمیگرداند؛ یعنی دقیقا همان چیزی که به دنبالش هستم!

 

بررسی حجم فایل آپلود شده

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

 

بررسی موجود بودن فایلی هم نام با فایل آپلود شده

اگر فایل مقصدی که به عنوان ورودی دوم تابع move_uploaded_file داده ایم، از قبل موجود باشد، فایل جدید جایگزین آن میشود و ممکن است مشکلاتی را برای اجرای برنامه به وجود بیاورد.

برای بررسی اینکه فایلی با نام مشخص در یک مسیر مشخص قرار دارد یا خیر، میتوان از تابع file_exists() در زبان PHP استفاده کرد.

به کد زیر توجه کنید:

 

اگر مقدار خروجی کد فوق true بود، به آن معناست که فایلی با همان نام و در مسیر مورد نظرمان وجود دارد.

 

 

آپلود فایل در سیستم های بزرگ و تجاری

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

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

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



[ برچسب ها ] : , , , , ,
ارسال شده در : بخش کامپیوتر
نظر شما در مورد اين پست چيست ؟

دیدگاه خود را به ما بگویید.

 
 
  دکتری تخصصی برق الکترونیک
طراح مدارهای الکترونیکی
برنامه نویس انواع میکروها
مشاوره و اجرای لینک های وایرلس
پیاده سازی سیستم های مبتنی بر شبکه
E_mail: electronic@sabzelco.ir
Tel: 09150462401
توسعه دهنده برنامه های سمت سرور

طراحی و برنامه نویسی سایت و پرتال های حرفه ای

E_mail: computer@sabzelco.ir
Tel: 09371974233