کلاس Upload چیست؟

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

فرمت‌های پشتیبانی شده: PNG، JPG، GIF، WEBP و BMP.

سازگار با PHP 5.3+, PHP 7 و PHP 8.

نحوه استفاده

ایجاد فرم آپلود فایل:



< form enctype="multipart/form-data" method="post" action="upload.php" >
 <  input type="file" size="32" name="image_field" value="" >
  <  input type="submit" name="Submit" value="upload" >
< /form>
    

کد PHP برای پردازش آپلود:


$handle = new \Verot\Upload\Upload($_FILES['image_field']);

if ($handle->uploaded) {
    $handle->file_new_name_body = 'image_resized';
    $handle->image_resize = true;
    $handle->image_x = 100;
    $handle->image_ratio_y = true;

    $handle->process(PUPATH.'/files/');

    if ($handle->processed) {
        echo 'image resized';
        $handle->clean();
    } else {
        echo 'error: ' . $handle->error;
    }
}
    

چگونه کار می‌کند؟

  • ابتدا کلاس را با آرایه $_FILES یا یک فایل محلی instantiate می‌کنید.
  • سپس متغیرهای پردازش مانند تغییر اندازه، تغییر نام یا فیلترگذاری را تنظیم می‌کنید.
  • متد process() را برای انجام عملیات فراخوانی می‌کنید.
  • پس از پردازش می‌توانید فایل را پاک کنید با استفاده از clean().
  • هر بار که process() را فراخوانی می‌کنید، تغییرات جدید اعمال می‌شود.

توجه: اگر هیچ متغیر پردازشی تنظیم نکنید، فایل به صورت ساده کپی می‌شود.

استفاده از Namespacing

این کلاس در فضای نام Verot\Upload قرار دارد.

نمونه استفاده:


use Verot\Upload\Upload;

$handle = new Upload($_FILES['image_field']);
    

یا به صورت مستقیم:


$handle = new \Verot\Upload\Upload($_FILES['image_field']);
    

پردازش فایل‌های محلی

برای کار با فایل‌های موجود روی سرور، کافی است مسیر فایل را به کلاس بدهید:


$handle = new Upload(PUPATH.'/user/myfile.jpg');
    

آپلود با XMLHttpRequest

برای فایل‌هایی که با Ajax یا XHR آپلود می‌شوند:


$handle = new Upload('php:' . $_SERVER['HTTP_X_FILE_NAME']);
    

با پیشوند php: داده‌ها مستقیماً از php://input دریافت می‌شود.

چگونه یک فایل آپلود شده از طریق XMLHttpRequest را پردازش کنیم؟

برای پردازش فایلی که از طریق XMLHttpRequest آپلود شده، ابتدا کلاس را با استفاده از کلیدواژه خاص php: نمونه‌سازی کنید. به این صورت:


$handle = new Upload('php:' . $_SERVER['HTTP_X_FILE_NAME']);
        

پیشوند php: به کلاس می‌گوید که داده‌های آپلود شده را از php://input دریافت کند و بقیه مسیر فایل معمولاً در $_SERVER['HTTP_X_FILE_NAME'] قرار دارد. البته می‌توانید از هر نامی که مناسب می‌بینید استفاده کنید:


$handle = new Upload('php:mycustomname.ext');
        

چگونه داده‌های خام فایل را پردازش کنیم؟

برای پردازش داده‌های خام فایل، کلاس را با استفاده از کلیدواژه data: نمونه‌سازی کنید. به این صورت:


$handle = new Upload('data:' . $file_contents);
        

اگر داده‌های شما base64 کدگذاری شده باشند، کلاس یک کلیدواژه ساده base64: را فراهم کرده است که داده‌های شما را قبل از استفاده رمزگشایی می‌کند:


$handle = new Upload('base64:' . $base64_file_contents);
        

چگونه زبان را تنظیم کنیم؟

برای تنظیم زبان، کلاس را با یک آرگومان دوم که کد زبان است، نمونه‌سازی کنید:


$handle = new Upload($_FILES['image_field'], 'fr_FR');
$handle = new Upload('/home/user/myfile.jpg', 'fr_FR');
        

چگونه فایل یا تصویر نتیجه را مستقیماً به مرورگر خروجی دهیم؟

برای این کار، کافی است متد process() را بدون آرگومان (یا با مقدار null به عنوان آرگومان اول) فراخوانی کنید:


$handle = new Upload($_FILES['image_field']);
header('Content-type: ' . $handle->file_src_mime);
echo $handle->process();
die();
        

اگر می‌خواهید دانلود فایل را اجباری کنید:


$handle = new Upload($_FILES['image_field']);
header('Content-type: ' . $handle->file_src_mime);
header("Content-Disposition: attachment; filename=" . rawurlencode($handle->file_src_name) . ";");
echo $handle->process();
die();
        

هشدار امنیتی

به طور پیش‌فرض، کلاس به شناسایی نوع MIME برای ارزیابی این که آیا فایل می‌تواند آپلود شود یا خیر، متکی است. چندین روش شناسایی MIME بسته به تنظیمات سرور استفاده می‌شود. این کلاس به یک لیست سیاه از پسوندهای فایل خطرناک برای جلوگیری از آپلود (یا تغییر نام اسکریپت‌های خطرناک به فایل‌های متنی) و یک لیست سفید از انواع MIME پذیرفته شده، متکی است.

اما هدف این کلاس انجام بررسی‌های عمیق و شناسایی فایل‌های مخرب نیست. به عنوان مثال، یک حمله‌کننده می‌تواند فایلی ایجاد کند که نوع MIME صحیحی داشته باشد، اما حاوی بار مخرب باشد، مانند یک فایل GIF معتبر که شامل کدی باشد که منجر به آسیب‌پذیری XSS می‌شود. اگر این فایل GIF دارای پسوند .html باشد، ممکن است آپلود شود (بسته به تنظیمات کلاس) و یک آسیب‌پذیری XSS را نشان دهد.

با این حال، شما می‌توانید این مسئله را با محدود کردن نوع فایل‌هایی که می‌توانند آپلود شوند، با استفاده از allowed و forbidden بر اساس نوع MIME یا پسوند فایل، برطرف کنید. امن‌ترین گزینه این است که فقط پسوندهای مورد نظر خود را در لیست سفید قرار دهید و اطمینان حاصل کنید که سرور همیشه فایل‌ها را با نوع محتوا بر اساس پسوند فایل ارسال می‌کند.


$handle->allowed = array('html');
$handle->forbidden = array();
$handle->no_script = false;
        

در نهایت، مسئولیت شماست که مطمئن شوید فایل‌های صحیح آپلود می‌شوند. اما مهم‌تر از همه، مسئولیت شماست که فایل‌های آپلود شده را به درستی ارائه دهید، مثلاً با اجبار سرور برای همیشه ارائه نوع محتوا بر اساس پسوند فایل.

عیب‌یابی

اگر کلاس آنطور که می‌خواهید عمل نمی‌کند، می‌توانید لاگ را نمایش دهید تا جزئیات دقیق‌تری از عملکرد کلاس مشاهده کنید. برای به دست آوردن لاگ، فقط این خط را در انتهای کد خود اضافه کنید:


echo $handle->log;
        

ممکن است مشکل شما قبلاً در سوالات متداول مورد بحث قرار گرفته باشد.

در غیر این صورت، می‌توانید در فروم‌ها جستجو کرده و سوال خود را بپرسید. لطفاً از مطرح کردن سوالات در مسائل GitHub خودداری کنید.

پارامترهای پردازش

توجه: تمام پارامترهای این بخش پس از هر پردازش بازنشانی می‌شوند.

مدیریت فایل

  • file_new_name_body : نام بدن فایل را جایگزین می‌کند (پیش‌فرض: null)
  • file_name_body_add : به نام بدن فایل پسوند اضافه می‌کند (پیش‌فرض: null)
  • file_name_body_pre : به نام بدن فایل پیشوند اضافه می‌کند (پیش‌فرض: null)
  • file_new_name_ext : پسوند فایل را جایگزین می‌کند (پیش‌فرض: null)
  • file_safe_name : نام فایل را ایمن می‌کند (فضاها به _ تبدیل می‌شوند و غیره) (پیش‌فرض: true)
  • file_force_extension : اگر پسوندی وجود نداشته باشد، پسوند را اجباری می‌کند (پیش‌فرض: true)
  • file_overwrite : رفتار فایل اگر قبلاً وجود داشته باشد را تعیین می‌کند (پیش‌فرض: false)
  • file_auto_rename : فایل را به طور خودکار اگر قبلاً وجود داشته باشد، تغییر نام می‌دهد (پیش‌فرض: true)
  • dir_auto_create : به طور خودکار دایرکتوری مقصد را در صورت عدم وجود ایجاد می‌کند (پیش‌فرض: true)
  • dir_auto_chmod : به طور خودکار سعی می‌کند دایرکتوری مقصد را در صورت عدم نوشتن مجوزها chmod کند (پیش‌فرض: true)
  • dir_chmod : chmod مورد استفاده هنگام ایجاد دایرکتوری یا اگر دایرکتوری قابل نوشتن نباشد (پیش‌فرض: 0777)
  • file_max_size : حداکثر اندازه آپلود (پیش‌فرض: مقدار upload_max_filesize از php.ini)
  • mime_check : بررسی MIME کلاس بر اساس لیست مجاز (پیش‌فرض: true)
  • no_script : تبدیل اسکریپت‌های خطرناک به فایل‌های متنی (پیش‌فرض: true)
  • allowed : آرایه‌ای از انواع MIME یا پسوندهای فایل مجاز (یا یک رشته). استفاده از wildcard مجاز است، مانند image/* (پیش‌فرض: بررسی init())
  • forbidden : آرایه‌ای از انواع MIME یا پسوندهای فایل ممنوع (یا یک رشته). استفاده از wildcard مجاز است
\/