PDA

View Full Version : انتخاب آواتار پیشفرض در صورتی که آواتار پیوست نشده باشد



abbas3zaar
شنبه 08 خرداد 1395, 17:01 عصر
سلام.

سوال 1- یه فرم داریم که نام و نام خانوادگی و غیره رو میگیره و یه فایل input file هم داریم که تصویر کاربر رو میشه انتخاب کرد. من با دستور زیر عکس رو آپلود میکنم. وقتی کاربر عکسی رو انتخاب کرد که آپلود میشه و هیچ. باهاش مشکلی نداریم.میخوام وقتی اصلا چیزی در input file انتخاب نشده بود یه عکس default.jpg که در پوشه img پروژه هست بجای عکس کاربر انتخاب بشه.

سوال 2 - الان در این کد من اگر عکسی هم نام باشه replace میشه با عکس قبلی. راه حل اون چیه؟
سوال 3 - میخوام وقتی عکس رو انتخاب کردیم اسم عکس بشه کد ملی یا کد دانش آموز مثلا اگر عکس انتخابی 12345.jpg بود بشه 2610013638.jpg
سوال 4 - بعد اگز ممکن هست از لحاظ امنیتی هم نکاتی که میشه روی این کد اضافه کرد رو هم بگید بنویسم. ممنون




if(isset($_POST['add_student'])){
$student_code = $_POST['student_code'];
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$birthdate = $_POST['birthdate'];
$code_melli = $_POST['codemelli'];

$student_image = $_FILES['student-image']['name'];
$student_image_temp = $_FILES['student-image']['tmp_name'];

move_uploaded_file($student_image_temp, "../img/students/$student_image" );

$query = "INSERT INTO tbl_students(student_code,student_firstname,studen t_lastname,student_birthdate, student_codemelli,student_pic,student_fathername,s tudent_reshte,student_paye)";
$query .= "VALUES('{$student_code}','{$firstname}','{$lastnam e}','{$birthdate}','{$code_melli}','{$student_imag e}', '{$father_name}','{$reshte}','{$paye}')";
$add_student_query = mysqli_query($connection,$query);

}

Unique
یک شنبه 09 خرداد 1395, 02:39 صبح
سوال ۱ - برای اینکه چک کنی ببینی پروفایل عکس داره یا نه یا باید ببینی عکسی بر اساس منطق برنامه خودتون توی پوشه مربوط به پروفایل ها ذخیره شده یا نه یا اگه مسیر را توی database ذخیره میکنی مطمئن باشی فیلد متناظر مسیر عکس null هست یا نه. اینطوری میتونی بر اساس یک شرط عکس default را نشون بدی.

سوال ۲ - اولا برای ذخیره عکس بهتره مسیر ها را absolute بدی نه relative یعنی از .. و . و / استفاده نکنی و کامل مسیر دیسک را بنویسی ! د رمورد اصل سوال هم بله replace یا overwritten میشه !

سوال ۲ - خوب توی پارامتر دوم move_uploaded_file میتونی اسم فایل را بر اساس نیاز هر چیزی بگذاری

سوال ۴ - موارد امنیتی خیلی زیاده اما این پست وبلاگم (http://www.geekfarsi.com/%D9%88%D9%82%D8%AA%DB%8C-%D8%AA%D9%88%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A7%D8%B2-%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-file-upload-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C%DA%A9%D9%86/377) خوندنش بی لطف نیست.

abbas3zaar
یک شنبه 09 خرداد 1395, 12:10 عصر
سوال ۱ - برای اینکه چک کنی ببینی پروفایل عکس داره یا نه یا باید ببینی عکسی بر اساس منطق برنامه خودتون توی پوشه مربوط به پروفایل ها ذخیره شده یا نه یا اگه مسیر را توی database ذخیره میکنی مطمئن باشی فیلد متناظر مسیر عکس null هست یا نه. اینطوری میتونی بر اساس یک شرط عکس default را نشون بدی.

سوال ۲ - اولا برای ذخیره عکس بهتره مسیر ها را absolute بدی نه relative یعنی از .. و . و / استفاده نکنی و کامل مسیر دیسک را بنویسی ! د رمورد اصل سوال هم بله replace یا overwritten میشه !

سوال ۲ - خوب توی پارامتر دوم move_uploaded_file میتونی اسم فایل را بر اساس نیاز هر چیزی بگذاری

سوال ۴ - موارد امنیتی خیلی زیاده اما این پست وبلاگم (http://www.geekfarsi.com/%D9%88%D9%82%D8%AA%DB%8C-%D8%AA%D9%88%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A7%D8%B2-%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-file-upload-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%85%DB%8C%DA%A9%D9%86/377) خوندنش بی لطف نیست.



در مورد سوال 1 - نمی خوام چک کنم عکس داره یا نه! چون مدیر فقط عکس اضافه میکنه و کاربر فقط مشاهده کننده اطلاعات هست در صفحه دانش آموزی هست و جز ارسال پیام به مدیر هیچ کار دیگه و insert ــی و... نمی تونه داشته باشه. پس در نتیجه مدیر خودش میبینه در مدیریت که طرف عکس داره یا نه. من در PHPMYADMIN ستون student_pic که از نوع varchar 255 هست رو Default اش رو As Defined زدم و کاراکتر default.jpg رو وارد کردم که به صورت پیشفرض اون رشته داخل فیلد باشه. ولی وقتی در مدیریت چیزی attach نمیکنم عکس رو نشون نمیده و فیلد عکس در phpmyadmin خالی هست! در این مورد (گذاشتن عکس پیشفرض) بیشتر میشه توضیح بدید.

در مورد سوال 2 - آخه چجوری
absolute بدم؟! چون صفحه add_student.php در پوشه admin هست و عکس ها یک پوشه قبل admin در img/students هست. (عکس زیر)

http://8pic.ir/images/6crtyrtu6o5zrl1ci5dq.jpg

http://8pic.ir/images/8b0afw6mg9csfgrure74.jpg


در مورد سوال 3 - توی کد من (در پست اول) کدوم قسمت اسم فایل بزارم؟ میخوام کد ملی اسم فایل باشه


سوال دیگر:

من یه کد پیدا کردم (کد زیر) آیا بنظر شما این کد بهینه و امن هست؟






<?php
$valid_formats = array("jpg", "png", "gif", "zip", "bmp"); // فایل های مجاز جهت آپلود
$max_file_size = 1024*100; //100 کیلوبایت
$path = "uploads/"; // فولدر مقصد
$count = 0; // متغیر شمارنده

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
// حلقه $_FILES برای اجرای تمامی فایل ها
foreach ($_FILES['files']['name'] as $f => $name) {
if ($_FILES['files']['error'][$f] == 4) {
continue; // پرش از فایل در صورت یافتن خطا
}
if ($_FILES['files']['error'][$f] == 0) {
if ($_FILES['files']['size'][$f] > $max_file_size) {
$message[] = "$name از حجمی بالاتر از مقدار مجاز برخوردار است.";
continue; // پرش در صورت داشتن حجم غیر مجاز
}
elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){
$message[] = "$name از فرمت فایلی مجاز برای آپلود برخوردار نیست.";
continue; // پرش در صورت داشتن فرمت غیر مجاز
}
else{ // اگر هیچ خطایی یافت نشد، فایل را منتقل کن!
if(move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path.$name)) {
$count++; // شمارنده تعداد فایل های آپلود شده
}
}
}
}
}
?>
<?php
# پیغام خطا
if (isset($message)) {
foreach ($message as $msg) {
printf("<p class='status'>%s</p></ br>\n", $msg);
}
}
# پیغام موفقیت آمیز بودن بارگذاری
if($count !=0){
printf("<p class='status'>%d فایل با موفقیت اضافه شد.</p>\n", $count);
}
?>

aaaaaaaa1
یک شنبه 09 خرداد 1395, 13:37 عصر
در مورد سوال 1 - نمی خوام چک کنم عکس داره یا نه! چون مدیر فقط عکس اضافه میکنه و کاربر فقط مشاهده کننده اطلاعات هست در صفحه دانش آموزی هست و جز ارسال پیام به مدیر هیچ کار دیگه و insert ــی و... نمی تونه داشته باشه. پس در نتیجه مدیر خودش میبینه در مدیریت که طرف عکس داره یا نه. من در PHPMYADMIN ستون student_pic که از نوع varchar 255 هست رو Default اش رو As Defined زدم و کاراکتر default.jpg رو وارد کردم که به صورت پیشفرض اون رشته داخل فیلد باشه. ولی وقتی در مدیریت چیزی attach نمیکنم عکس رو نشون نمیده و فیلد عکس در phpmyadmin خالی هست! در این مورد (گذاشتن عکس پیشفرض) بیشتر میشه توضیح بدید.

در مورد سوال 2 - آخه چجوری
absolute بدم؟! چون صفحه add_student.php در پوشه admin هست و عکس ها یک پوشه قبل admin در img/students هست. (عکس زیر)


http://8pic.ir/images/6crtyrtu6o5zrl1ci5dq.jpg

http://8pic.ir/images/8b0afw6mg9csfgrure74.jpg


در مورد سوال 3 - توی کد من (در پست اول) کدوم قسمت اسم فایل بزارم؟ میخوام کد ملی اسم فایل باشه


سوال دیگر:

من یه کد پیدا کردم (کد زیر) آیا بنظر شما این کد بهینه و امن هست؟






<?php
$valid_formats = array("jpg", "png", "gif", "zip", "bmp"); // فایل های مجاز جهت آپلود
$max_file_size = 1024*100; //100 کیلوبایت
$path = "uploads/"; // فولدر مقصد
$count = 0; // متغیر شمارنده

if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
// حلقه $_FILES برای اجرای تمامی فایل ها
foreach ($_FILES['files']['name'] as $f => $name) {
if ($_FILES['files']['error'][$f] == 4) {
continue; // پرش از فایل در صورت یافتن خطا
}
if ($_FILES['files']['error'][$f] == 0) {
if ($_FILES['files']['size'][$f] > $max_file_size) {
$message[] = "$name از حجمی بالاتر از مقدار مجاز برخوردار است.";
continue; // پرش در صورت داشتن حجم غیر مجاز
}
elseif( ! in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats) ){
$message[] = "$name از فرمت فایلی مجاز برای آپلود برخوردار نیست.";
continue; // پرش در صورت داشتن فرمت غیر مجاز
}
else{ // اگر هیچ خطایی یافت نشد، فایل را منتقل کن!
if(move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path.$name)) {
$count++; // شمارنده تعداد فایل های آپلود شده
}
}
}
}
}
?>
<?php
# پیغام خطا
if (isset($message)) {
foreach ($message as $msg) {
printf("<p class='status'>%s</p></ br>\n", $msg);
}
}
# پیغام موفقیت آمیز بودن بارگذاری
if($count !=0){
printf("<p class='status'>%d فایل با موفقیت اضافه شد.</p>\n", $count);
}
?>

سلام
دوست عزیز کد شما من نیست
باید از GD استفاده کنید


راجب سوال اول :
یک شرط در هنگام نمایش اواتار قرار میدید اگر خالی بود آواتار پیش فرض اگر هم نبود که لینک تصویر آپلود شده رو نمایش میدی همین

این فانکشن :

function resize($width, $height){
/* Get original image x y*/
list($w, $h) = getimagesize($_FILES['file1']['tmp_name']);
/* calculate new image size with ratio */
$ratio = max($width/$w, $height/$h);
$h = ceil($height / $ratio);
$x = ($w - $width / $ratio) / 2;
$w = ceil($width / $ratio);
/* new file name */
$path = '../tmp/profileimg/'.$width.'x'.$height.'_'.$_FILES['file1']['name'];
$path_one = '../tmp/profileimg/'."100x100".'_'.$_FILES['file1']['name'];
/* read binary data from image file */
$imgString = file_get_contents($_FILES['file1']['tmp_name']);
/* create image from string */
$image = imagecreatefromstring($imgString);
$tmp = imagecreatetruecolor($width, $height);
imagecopyresampled($tmp, $image,
0, 0,
$x, 0,
$width, $height,
$w, $h);
/* Save image */
switch ($_FILES['file1']['type']) {
case 'image/jpeg':
imagejpeg($tmp, $path, 100);
break;
case 'image/png':
imagepng($tmp, $path, 0);
break;
case 'image/gif':
imagegif($tmp, $path);
break;
default:
exit;
break;
}
return $path_one;
/* cleanup memory */
imagedestroy($image);
imagedestroy($tmp);

}


این هم کد اپلود :


// settings
$max_file_size = 1024*200; // 200kb
$valid_exts = array('jpeg', 'jpg', 'png', 'gif');
// thumbnail sizes
$sizes = array(100 => 100, 150 => 150, 250 => 250);

if ($_SERVER['REQUEST_METHOD'] == 'POST' AND isset($_FILES['file1'])) {
if( $_FILES['file1']['size'] < $max_file_size ){
// get file extension
$ext = strtolower(pathinfo($_FILES['file1']['name'], PATHINFO_EXTENSION));
if (in_array($ext, $valid_exts)) {
/* resize image */
$true= "yes";
foreach ($sizes as $w => $h) {
$files[] = resize($w, $h);
}

}
}
}
if($true){

$path = str_replace('..','',resize()); // GET Path

$query_up = "UPDATE `user` SET `avatar` ='$path' WHERE `id`='".$user_id."'";
$result_up = mysqli_query($con,$query_up );

echo '<div class="uk-alert uk-alert-success" data-uk-alert="" style="width: 88%;">
<a href="#" class="uk-alert-close uk-close"></a>
تصویر پروفایل شما با موفقیت برزرسانی شد
</div>';}else{
echo '<div class="uk-alert uk-alert-danger" data-uk-alert="" style="width: 88%;">
<a href="#" class="uk-alert-close uk-close"></a>
بارگذاری انجام نشد . تنها تصاویر با فرمت .jpg , .jpeg, .png مجاز میباشند.
</div>';
}

}
در ضمن این کد در 3 سایز تصویر رو ذخیره مکینه
...
و اینکه بصورت مستقیم آپ نمیکنه کد ها رو کپی میکنه و یک تصویر جدید مییسازه برای همین اگر کد php هم اپ کردند کد ها اجرا نمیشه و تصویر سیاه میاد
موفق باشید.

Unique
دوشنبه 10 خرداد 1395, 00:39 صبح
در مورد سوال 1 - نمی خوام چک کنم عکس داره یا نه! چون مدیر فقط عکس اضافه میکنه و کاربر فقط مشاهده کننده اطلاعات هست
شما متوجه منظور من نشدین ! توی سناریو شما که دارین مسیر عکس را توی Database ذخیره میکنید به این شکل عمل میکنید که اصلا نیاز نیست مقدار default.jpg را توی فیلد برای هر کاربر ذخیره کنید. بلکه در زمان insert اگه عکسی نباشه مقدار Null بدین به فیلد حالا زمانی که میخواین عکس را به کاربر نشون بدین این فیلد را با یک شرظ چک میکنید که مقدار داره یا Null هست و اگه مقدار داشت که عکس را نشون میدین و اگه null بود عکس default را :


if (!is_null($row['fld_pic']))
echo "<img src= '/images/profiles/{$row['fld_pic']}' />";
else
echo "<img src='/images/default.jpg' />";


آخه چجوری absolute بدم؟! چون صفحه add_student.php در پوشه admin هست و عکس ها یک پوشه قبل admin در img/students هست.
روی لوکال گویا فولدر اصلی سایت شما htdocs هست و روی سرور همن public_html یا همون www یا wwwroot که برای بدست آوردن مسیرسش میتونی از DOCUMENT_ROOT در آرایه SERVER_$ استفاده کنی یعنی مسیر absolute میشه :


$absolute_path = $_SERVER['DOCUMENT_ROOT']."system/img/students/[image_file_name]"

حالا یک فولدر بالا و پایین را میتونی خودت تغییر بدی.


در مورد سوال 3 - توی کد من (در پست اول) کدوم قسمت اسم فایل بزارم؟ میخوام کد ملی اسم فایل باشه
خوب باید نام فایلی که میخوای ذخیره کنی را تغییر بدی ، مثلا :

$student_image = "{$_SERVER['DOCUMENT_ROOT']}system/img/students/{$_POST['meli_code']}.".pathinfo($_FILES['student-image']['name'],PATHINFO_EXTENSION);
move_uploaded_file($_FILES['student-image']['tmp_name'], $student_image);

در مورد امنیت کد هم دوستمون توضیح داد و میتونی از GD استفاده کنی.