PDA

View Full Version : سوال: آپلود عکس در سایز های متفاوت و با نام های متفاوت



arashmanteghi
چهارشنبه 09 آذر 1390, 21:32 عصر
سلام دوستان. وقت بخیر.
من میتونم عکسی رو روی هاست آپلود کنم و آدرسش رو توی دیتابیس ذخیره کنم.اما فرض کنید میخوام این عکس ها رو به عنوان آواتار هر کاربر استفاده کنم. خب؟ حالا عکسی رو که 800*600 هست رو منطقی نیست فقط موقع نمایش هر عکس، اون رو کوچیک کنم. چون حجمش کم نمیشه و اینجوری صفحه سنگین میشه.
برای این که عکسی که کاربر آپلود میکنه رو در سایز های مختلف روی هاست داشته باشم باید چه کار کنم؟
مثلاً کاربرِ سایت من میاد یه عکس رو آپلود میکنه واسه آواتارش، بعد این عکس باید توی آلبوم عکس هاش هم بره. من میخوام توی آلبوم عکس هاش با سایز طبیعی باشه و واسه آواتارش با سایز کچیکتر، مثلاً 24*24 . لطفاً راهنماییم کنید.

یه سوال دیگه هم که داشتم درباره نام عکس هایی هست که آپلود میشه. من الان با همون نامی که خودشون دارن میتونم آپلود کنم. اگه دو عکس هم نام رو یکی بعد از دیگری آپلود کنم، این میره روی اون کپی میشه و یه عکس این وسط از بین میره. من چطور میتونم نام رندومی بهش بدم و مطمئن باشم که این نام روی عکس های قبلی نیست؟

خواهش میکنم اگر در این دو مورد اطلاعاتی دارید منو راهنمایی کنید.

MSN_Issue
چهارشنبه 09 آذر 1390, 22:15 عصر
در مورد سوال اول، کلاس های زیادی برای کار با عکس ها وجود داره که با یه سرچ کوچیک در میآد !!!
در مورد سوال دوم هم میتونید از توابع Date(U) و uniquid() استفاده کنید که یه رشته ی 10-12 رقمی رو بر اساس زمان بهتون تحویل میدن...
چون زمان به عقب بر نمی گرده (!) پس خروجی این توابع هم یونیک هستند و میتونید ازشون برای اسم عکسا استفاده کنید ...:چشمک:

arashmanteghi
پنج شنبه 10 آذر 1390, 00:23 صبح
از راهنماییتون ممنونم. اگه در این موارد سوال داشتم همینجا مطرح میکنم. لطفاً هوامو داشته باشین.

arashmanteghi
پنج شنبه 10 آذر 1390, 00:55 صبح
برای اسم مثلاً با یه همچین چیزی کارم راه می افته؟ احتمال اینکه دوتا تکراری به وجود بیاد اینجا چقدره؟


$uniq_name = "a".uniqid()."-".time();

یا مثلاً اینجوری بهتره؟


$uniq_name = uniqid(time());

MSN_Issue
پنج شنبه 10 آذر 1390, 07:22 صبح
دوست عزیز خروجی uniqid همون خروجی time هست، با این تفاوت که به مبنای 16 تبدیل شده !!!
به به تنهایی یونیک هست و احتیاجی به ترکیب با چیزای دیگه نیست ...

arashmanteghi
پنج شنبه 10 آذر 1390, 14:53 عصر
دوست عزیز خروجی uniqid همون خروجی time هست، با این تفاوت که به مبنای 16 تبدیل شده !!!
به به تنهایی یونیک هست و احتیاجی به ترکیب با چیزای دیگه نیست ...
از این راهنماییت ممنونم، داشتم لقمه رو دور سرم میپیچوندم.
من یه تابع دیدم توی همین سایت که ازش استفاده کردم و کار نکرد. البته ارور هم نداد. توی این آدرس (http://barnamenevis.org/showthread.php?236279-%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%B3%D8%A7%DB%8C%D8%B2-%D8%B9%DA%A9%D8%B3&highlight=%D8%B3%D8%A7%DB%8C%D8%B2+%D8%B9%DA%A9%D8 %B3) بود.
کد های php.net رو دیدم و با این دوتا کار کردم، خیلی هم خوب جواب داد اما یه ایرادی داره به نظرم.


<?php
// The file
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-Type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, null, 100);
?>

و


<?php
// The file
$filename = 'test.jpg';

// Set a maximum height and width
$width = 200;
$height = 200;

// Content type
header('Content-Type: image/jpeg');

// Get new dimensions
list($width_orig, $height_orig) = getimagesize($filename);

$ratio_orig = $width_orig/$height_orig;

if ($width/$height > $ratio_orig) {
$width = $height*$ratio_orig;
} else {
$height = $width/$ratio_orig;
}

// Resample
$image_p = imagecreatetruecolor($width, $height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);

// Output
imagejpeg($image_p, null, 100);
?>

با این ها من نمیدونستم عکسی که resize شده رو چطور دخیره کنم. البته الان که فکر میکنم میبینم نیازی به دخیره نست فعلاً. اینطوری کار کنم که عکس های کاربر توسط خودشون آپلود بشه با اندازه اصلی و آدرس هر عکس توی database ذخیره شه، بعدش اگه خواستم 30 تا عکس پروفایل رو با هم نشون بدم،آدرس عکس ها رو میخونم و میزارم ورودی این تابع، هوم؟ این تریپی خوبه؟ اینجوری لود شدن صفحه که سنگین نمیشه، میشه؟

راستی من یه چندتا نمونه هم توی همون manual پی اچ پی دیدم به عنوان نمونه های promaty at gmail dot com و hotmail dot com و چندتا دیگه که میگفت قابلیت crop کردن هم داره. میشه شما ها که تجربه بیشتری دارید این مسئله crop کردن و کلاً تغییر سایز توسط کاربر رو مورد بررسی قرار بدین؟ حالا چه خودتون، چه از روی همون کد php.net که من اشاره کردم.
اونی که میگم به این آدرس (http://www.php.net/manual/en/function.imagecopyresampled.php) هست. خیلی عالی میشه اگه این کارو بکنید.

با تشکر.

arashmanteghi
پنج شنبه 10 آذر 1390, 15:09 عصر
آخ یه مشکلی دارم، وقتی این کارو میکنم اون صفحه فقط همین عکس رو resize میکنه و حتی یه دستور echo ساده هم توش کار نمیکنه. من میخواستم این عکس های کوچیک شده رو بین تگ a بزارم تا بهشون لینک بدم. اینجوری اصلاً لینک هم نمیشه بهش داد. لطفاً بگید چه کار کنم؟

الان اینو نگاه کنید، اصلاً انگار نه انگار که لینک دادم بهش مثلاً


<?php
function resize ($filename,$percent) {

// Content type
header('Content-Type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
return imagejpeg($image_p, null, 100);
}

$filename = 'uploads/test.jpg';
$percent = 0.5;
echo "<hr /><a href=\"http://php.net\">". resize($filename, $percent) ."</a>";
?>

MSN_Issue
پنج شنبه 10 آذر 1390, 15:42 عصر
header('Content-Type: image/jpeg');
شما وقتی این هدر بالا رو میذارید توی یه فایل یعنی دیگه اون فایل خروجیش عکسه !! نه کد html ... در نتیجه فقط میتونه براتون یه عکس نشون بده .
شما باید کد زیر رو توی یه فایل مثل user_pic.php ذخیره کنید


<?php
// Content type
header('Content-Type: image/jpeg');
// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;
// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
// Output
imagejpeg($image_p, null, 100);
?>


بعد اینطوری ازش استفاده کنید :

<a href="php.net"><img src="user_pic.php" /></a>

arashmanteghi
پنج شنبه 10 آذر 1390, 18:13 عصر
ممنونم ، اما خیلی پیچیده شده ، توی پروژه بزرگ دردسره استفاده ازش.
مخصوصاً وتسه من که دارم oop یاد میگیرم و میخواستم با oop انجام بدمش. اما کارم راه افتاده الان.
درباره crop کردن کسی نیست کمکی بکنه ؟