بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

تابعی امن برای آپلود عکس بهمراه ساخت Thumbnail

مدیریت گفتگو
محسن موحد 11 سال پیش
آخرین تغییر: 8 سال پیش

سلام.

name : نامی که در تگ اینپوت (با تایپ file) , مشخص کرده ایم.
thumb : اگر true باشد , تصویر بند انگشتی (thumbnail) هم میسازد.
max_size : حداکثر سایز مجاز برای یک تصویر
width , height : تصویر با این طول و ارتفاع آپلود می شود.
T_width , T_height : طول و ارتفاع برای تصویر بند انگشتی.

 

function imageUpload($name, $thumb=false, $max_size=5242880, $height=null, $width=null, $T_height=100, $T_width=100)
{
    /*if (file_exists($_FILES[$name]['tmp_name']) && $_FILES[$name]['size'] > 0)
    {
        return false;
    }*/
    if(!isset($_FILES[$name]))
    {
        return false;
    }
// mimetypes $allowedTypes = array('image/gif', 'image/jpeg', 'image/png', 'image/wbmp'); $image = &$_FILES[$name]; if ($image['error'] == 0 && in_array($image['type'], $allowedTypes) && $image['size'] <= $max_size) { $in = ''; switch ($image['type']) { case 'image/gif': $in = 'imagecreatefromgif'; break; case 'image/jpeg': $in = 'imagecreatefromjpeg'; break; case 'image/png': $in = 'imagecreatefrompng'; break; case 'image/wbmp': $in = 'imagecreatefromwbmp'; break;
default: return false; } $src = $in($image['tmp_name']); $height = ($height == null || $height <= 0 ? imagesy($src) : $height); $width = ($width == null || $width <= 0 ? imagesx($src) : $width); $dst = imagecreatetruecolor($width, $height); imagecopyresized($dst, $src, 0, 0, 0, 0, $width, $height, imagesx($src), imagesy($src));
$fileName = '';
// file name is created do { $fileName = makeHash(mt_rand(0, mt_getrandmax()) . microtime(true), $image['tmp_name']); } while(file_exists('/image/' . $fileName . '.jpg') || ($thumb && file_exists('/thumb/' . $fileName . '.jpg')));

// creates a JPEG file from the given $dst and Save the image file. imagejpeg($dst, '/image/' . $fileName . '.jpg', 75);

//********* for thumbnail *********//
if ($thumb) { $dst = imagecreatetruecolor($T_width, $T_height); imagecopyresized($dst, $src, 0, 0, 0, 0, $T_width, $T_height, imagesx($src), imagesy($src));

// creates a JPEG file from the given $dst and Save the image file. imagejpeg($dst, '/thumb/' . $fileName . '.jpg', 75); }
imagedestroy($src); imagedestroy($dst);
// return file name return $fileName . '.jpg'; } }


 

در قسمت fileName از تابع makeHash استفاده کردیم:

function makeHash($value, $salt = '')
{
    for ($i = 0; $i < 1000; $i++)
    {
        $value = md5(PEPPER . $value . md5($salt));
    }
    return $value;
}

PEPPER : میتونید بعنوان یک ثابت و با مقدار دلخواهتون (ترکیبی از علامت ها) تعریفش کنید.

نظرات

Mr Mehdi 11 سال پیش
ببخشید. چه لزومی داره که fileName هش بشه؟
reza piry ghadim 11 سال پیش
یه دلیلیش اینکه ممکنه یکی یه فایل php رو تغییر نام بده اخرش رو کنه jpg و دانلود کنه . اونوقت مفسر پی اچ پی همون فایل php رو اجرا میکنه. مثلا ممکنه یکی یه شل بنویسه تو فایلی به نام shell.php اخر سر اسمشو تغییر بده به shell.php.jpg که در این صورت پی اچ پی باز هم اون شل رو اجرا میکنه . سایت آشیانه هم تقریبا اینجوری هک شده بود توسط TBH .
reza piry ghadim 11 سال پیش
البته فک کنم دلایل بیشتری داشته باشه که من نمیدونم. چون اگه یه کد بنویسیم که sell.php.jpg رو به shell-php.jpg تغییر بده دیگه اجرا نمیشه.http://answers.uncomaster.com/question/303/ارور-کد-اپلود-عکس- این و ببینی نوشتم . یکم مشکل داشت اقا محسن هم کاملش کرد.
محسن موحد 11 سال پیش
در ادامه ی صحبت آقا رضا , دیگه اسم فایل بعد از تغییر در بعضی کاربرد ها قابل تشخیص نیست.
Amir Hossein 8 سال پیش
دوستان بعد از Switch مقدار src باید چی باشه؟ واسه من یه همچین عبارتی رو چاپ میکنه Resource id #13 مشکل از کجاست؟
RODER 8 سال پیش
اسم تصویرو میشه برابر تایم استمپ قرار داد هیچوقت تکرار نمیشه
RODER 8 سال پیش
من یک تایع نوشتم برای اینکار اگه خیلی کوتاه تره اگه مایل باشید کدشو بزارم براتون

هنوز پاسخی ثبت نشده است


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .