PDA

View Full Version : سوال: مشکل با آپلود عکس



milad_d993
پنج شنبه 05 اردیبهشت 1398, 12:01 عصر
سلام دوستان.:بوس:
برای آپلود عکس از کد زیر اسفاده میکنم
فقط عکس های با پسوند png رو آپلود میکنه. و برای بقیه عکس ها خطای format رو برمیگردانه
نظرتون درمورد این تابع چیه؟ چیزی اظافه یا کم داره؟؟ :متفکر:


<?php
function image_check($file){
$result['flag'] = false;
$result['error'] = '';
$result['target_dir'] = 'uploads/';
$target_file = $result['target_dir'] . basename($file['name']);
$result['pic_type'] = strtolower(pathinfo($target_file,PATHINFO_EXTENSIO N));
if($file['error'] != 0){
switch($file['error']){
case 4:
$result['error'] = 'unselected';
return $result;
case 1:
case 2:
$result['error'] = 'size';
return $result;
default:
$result['error'] = 'unknown';
return $result;
}
}else if($file['size'] > 524288){ /* 512KB */
$result['error'] = 'size';
return $result;
}else if(!extension_loaded('fileinfo')){
$result['error'] = 'fileinfo';
return $result;
}else if(!extension_loaded('gd') && !extension_loaded('gd2')){
$result['error'] = 'gd';
return $result;
}else{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimetype = finfo_file($finfo, $file['tmp_name']);
finfo_close($finfo);
if(!getimagesize($file['tmp_name']) || !in_array($result['pic_type'], array('png','gif','bmp','jpg','jpeg')) || !in_array($mimetype, array('image/png','image/gif','image/bmp','image/jpeg'))){
$result['error'] = 'format';
return $result;
}else{
$res = false;
switch($file['error']){
case 'png' :
$res = imagecreatefrompng($file['tmp_name']);
break;
case 'gif' :
$res = imagecreatefromgif($file['tmp_name']);
break;
case 'bmp' :
$res = imagecreatefromwbmp($file['tmp_name']);
break;
case 'jpg' :
case 'jpeg':
$res = imagecreatefromjpeg($file['tmp_name']);
break;
}
if(!$res){
imagedestroy($res);
$result['error'] = 'format';
return $result;
}else imagedestroy($res);
}
}
$result['flag'] = true;
return $result;
}
?>

تست کردم خروجی توابع imagecreatefromX ریسورس (Resource) بود ولی تو یه وبلاگ فارسی ک نمونه کد گذاشته بود اینطوری استفاده کرده بود ک خروجی تابع انگار bool هستش.
نوع Resource چیه دقیقا؟؟

ali_sed
جمعه 06 اردیبهشت 1398, 09:40 صبح
سلام

متغیر ریسورس، ارجاع به یک منبع خارجی است مانند زمانی که قصد دارید اطلاعاتی را از دیتابیس بخوانید php مستقیم به دیتای درون دیتابیس دسترسی ندارد بلکه با منبع خارجی (مثلا دیتابیس Mysql) ارتباط برقرار می کند و درخواست خود را ارسال می کند. یا حتی زمانی که قصد دارید محتوای فایلی را بخوانید خروجی دستور fopen از نوع ریسورس می باشد. در اینجا نیز دستور imagecreatefromjpeg از کتابخانه GD استفاده می کند که یک منبع بیرونی است.

اینکه چرا برای برخی تصاویر خطای فرمت میدهد باید دیباگ کنید. خطای فرمت مربوط به شرطهای درج شده در خط ۳۴ و ۵۴ می باشد بنابراین شرط ها را بصورت مجزا با استفاده از دستور var_dump نمایش دهید تا مشخص شود دقیقا مشکل کجاست. مثلا برای شرط خط ۳۴ کافیست این دستورات را به کد خود اضافه کنید و بعد با تصویری که آپلود نمیشود تست کنید:



var_dump( array(
$file['tmp_name'],

"getimagesize:",
getimagesize($file['tmp_name']) ,

"pic_type:",
$result['pic_type'],
!in_array($result['pic_type'], array('png','gif','bmp','jpg','jpeg')) ,

"mimetype:",
$mimetype,
!in_array($mimetype, array('image/png','image/gif','image/bmp','image/jpeg')))
);

milad_d993
جمعه 06 اردیبهشت 1398, 10:21 صبح
سلام

متغیر ریسورس، ارجاع به یک منبع خارجی است مانند زمانی که قصد دارید اطلاعاتی را از دیتابیس بخوانید php مستقیم به دیتای درون دیتابیس دسترسی ندارد بلکه با منبع خارجی (مثلا دیتابیس Mysql) ارتباط برقرار می کند و درخواست خود را ارسال می کند. یا حتی زمانی که قصد دارید محتوای فایلی را بخوانید خروجی دستور fopen از نوع ریسورس می باشد. در اینجا نیز دستور imagecreatefromjpeg از کتابخانه GD استفاده می کند که یک منبع بیرونی است.

اینکه چرا برای برخی تصاویر خطای فرمت میدهد باید دیباگ کنید. خطای فرمت مربوط به شرطهای درج شده در خط ۳۴ و ۵۴ می باشد بنابراین شرط ها را بصورت مجزا با استفاده از دستور var_dump نمایش دهید تا مشخص شود دقیقا مشکل کجاست. مثلا برای شرط خط ۳۴ کافیست این دستورات را به کد خود اضافه کنید و بعد با تصویری که آپلود نمیشود تست کنید:



var_dump( array(
$file['tmp_name'],

"getimagesize:",
getimagesize($file['tmp_name']) ,

"pic_type:",
$result['pic_type'],
!in_array($result['pic_type'], array('png','gif','bmp','jpg','jpeg')) ,

"mimetype:",
$mimetype,
!in_array($mimetype, array('image/png','image/gif','image/bmp','image/jpeg')))
);


ممنون از راهنمایی تون.
بیشتر میخواستم بدونم ک کد ها خطای منطقی داره یا نه.
عکس ها رو با paint xp :خجالت: ایجاد کرده بودم. ک فقط عکس ایجادی با پسوند png اون رو آپلود میکرد.
توابع imagecreatefromjpeg و ... خروجیشون به gd بولین هست آیا؟؟

دکمه تشکر کجا رفته؟؟

milad_d993
سه شنبه 17 اردیبهشت 1398, 13:22 عصر
عکسی که از اول هم پسوندش bmp یا jpg باشه آپلود نمیکنه با این کد :گریه::گریه::گریه:
خطای format میده !!
فقط عکس های png آپلود میشن :عصبانی++::عصبانی++::عصبانی++:: صبانی++::عصبانی++:

ali_sed
چهارشنبه 18 اردیبهشت 1398, 13:04 عصر
عکسی که از اول هم پسوندش bmp یا jpg باشه آپلود نمیکنه با این کد :گریه::گریه::گریه:
خطای format میده !!
فقط عکس های png آپلود میشن :عصبانی++::عصبانی++::عصبانی++:: صبانی++::عصبانی++:

سلام

شما لطفا خروجی کدهایی که توضیح دادم را روی عکسی که آپلود نمی شود ارسال کنید تا ببینیم مشکل کجاست.
ممکن است پلاگین خاصی روی سرور شما نصب نباشد و برنامه نمیتواند فرمت ها را به درستی شناسایی کنید مثلا FILEINFO_MIME_TYPE ممکن است درست عمل نکند.