کلاس 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>
$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()
را فراخوانی میکنید، تغییرات جدید اعمال میشود.توجه: اگر هیچ متغیر پردازشی تنظیم نکنید، فایل به صورت ساده کپی میشود.
این کلاس در فضای نام 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');
برای فایلهایی که با Ajax یا XHR آپلود میشوند:
$handle = new Upload('php:' . $_SERVER['HTTP_X_FILE_NAME']);
با پیشوند php:
دادهها مستقیماً از php://input
دریافت میشود.
برای پردازش فایلی که از طریق 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 خودداری کنید.
توجه: تمام پارامترهای این بخش پس از هر پردازش بازنشانی میشوند.
image/*
(پیشفرض: بررسی init())