PDA

View Full Version : مبتدی: thumbnail در php



mehsaa
دوشنبه 15 مهر 1392, 00:07 صبح
سلام
برای اینکه عکسی که میخوام آپلود کنم قبل از آپلود سایزش و کوچیک کنم باید این تغییر سایز قبل از گرفتن محتوای عکس باشه یا بعدش؟
کدهای مشترکی که تو اینترنت هست همشون تقریبا یه دستور هست که این هست :


[

<?php
$img = imagecreatefromjpeg( "{$pathToImages}{$fname}" );
$width = imagesx( $img );
$height = imagesy( $img );

// calculate thumbnail size
$new_width = $thumbWidth;
$new_height = floor( $height * ( $thumbWidth / $width ) );

// create a new temporary image
$tmp_img = imagecreatetruecolor( $new_width, $new_height );

// copy and resize old image into new image
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );

// save thumbnail into a file
imagejpeg( $tmp_img, "{$pathToThumbs}{$fname}" );
?>


خط آخرش و متوجه نمیشم که دقیقا کدوم قسمت فایل هست که نشون میده؟
ممنون میشم دوستان کسی میدونه بهم توضیح بده مرسی

MMSHFE
دوشنبه 15 مهر 1392, 00:29 صبح
خط اول برای خوندن تصویر JPEG شما هست که باید از مسیر تصاویر اصلی خونده بشه (اگه نوع تصویر فرق میکنه، از تابع مناسب مثل imagecreatefrompng و... استفاده کنید). خط دوم پهنای تصویر اصلی رو بدست میاره. خط سوم ارتفاع تصویر اصلی رو مشخص میکنه. خط چهارم پهنای تصویر پیشنمایش رو مشخص میکنه (باید بجای thumbWidth$ پهنا رو مشخص کنید). خط پنجم با توجه به نسبت ارتفاع به پهنای تصویر اصلی، ارتفاع تصویر پیشنمایش رو نسبت به پهناش محاسبه میکنه. خط ششم یک تصویر جدید با پهنا و ارتفاع پیشنمایش میسازه. خط هفتم تصویر اصلی رو با اندازه های جدید، در تصویر پیشنمایش کپی میکنه. خط هشتم تصویر پیشنمایش رو در مسیر تصاویر پیشنمایش با نوع JPEG ذخیره میکنه. مثالی از کاربرد کد شما:


<?php
$img = imagecreatefromjpeg('../images/photo1.jpg');
$width = imagesx($img);
$height = imagesy($img);

// calculate thumbnail size
$new_width = 100;
$new_height = floor($height * ($thumbWidth / $width));

// create a new temporary image
$tmp_img = imagecreatetruecolor($new_width, $new_height);

// copy and resize old image into new image
imagecopyresized($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// save thumbnail into a file
imagejpeg($tmp_img, '../thumbs/photo1.jpg');
?>

mehsaa
دوشنبه 15 مهر 1392, 00:38 صبح
خیلی ممنون
پس من باید این کار و قبل از گرفتن محتوای فایلم انجام بدم درسته؟
این کد من هست که بعد از اینکه type, mime, imagtype , فرمت و ... فایل و چک کردم با این قسمت محتوای فایلم و میگیرم و در نهایت تو دیتابیس ذخیره میکنم، الان نمیدونم باید با این کد بالا چه جوری با این کار کنم


<?php
$pictype=(get_magic_quotes_gpc()==0 ? mysql_real_escape_string(
$_FILES['pic']['type']) : mysql_real_escape_string(
stripslashes ($_FILES['pic'])));
$fp = fopen($pictmp, 'r');
$piccontent = fread($fp, filesize($pictmp));
$piccontent = addslashes($piccontent);
fclose($fp);
if(!get_magic_quotes_gpc())
{
$picname = addslashes($picname);
}
?>

یعنی با کد بالا


$_FILES['file']['name']; = $tmp_img
و
$tmp_img = '../thumbs/photo1.jpg'


میشه؟

ممنونم

MMSHFE
دوشنبه 15 مهر 1392, 07:44 صبح
بهتره برای امنیت بیشتر، خود تصویر رو هم با GD ذخیره کنید نه با fopen و یا move_uploaded_file و سایر روشهای مرسوم.

mehsaa
دوشنبه 15 مهر 1392, 20:41 عصر
خیلی ممنونم
میشه لطف کنید بگید fopen یا move_upload_file از نظر امنیتی چه مشکلی دارن؟

حقیقتش جواب سوالم و نگرفتم تو کدی که گذاشتم این تغییر و باید قبل از گرفتن محتوای فایل انجام بدم یا بعدش؟ ممنون

MMSHFE
دوشنبه 15 مهر 1392, 22:10 عصر
مشکل اینه که اگه کد PHP توی فایل باشه، اون کدها هم توی فایلی که در پوشه تصاویر کپی میشه، باقی میمونه ولی اگه با GD تصویر رو بخونیم و یک نسخه جدید از روش تولید کنیم، کدهای PHP و... داخل تصویر حذف میشه.

mehsaa
دوشنبه 15 مهر 1392, 23:29 عصر
مرسی
حتی اگه هم mime ، type ... هم بررسی بشه باز هم میشه تو اون عکس کد پی اچ پی باشه؟
یعنی میشه فایلی mime عکس یا پی دی اف و وررد داشته باشه باز هم محتواش کد پی اچ پی باشه؟

MMSHFE
دوشنبه 15 مهر 1392, 23:42 عصر
بله. MIME از روی پسوند انتخاب میشه. حتی در سیستمهایی که بطور هوشمند ازروی هدر فایلها، MIME رو تشخیص میدن هم میشه بعد از اینکه فایل سالم ساخته شد، با کمک یکسری ابزارهای خاص مثل Hex Editorها و... کدهای موردنظر رو در قسمت Data تزریق کرد.

mehsaa
چهارشنبه 17 مهر 1392, 12:37 عصر
مرسی خیلی ممنونم
ببخشید یه سوال دیگه هم دارم
GD فقط برای تصاویر هست یا فایل ها متنی مثل pdf docx... هم ازش استفاده میشه؟
یه سوال دیگه اینکه برای هدر صفحه ای که میخوام فایل ها رو نمایش بدم چه عکس چه فایل های متنی، باید type و در نظر بگیرم برای هدر یا mime فایل را در نظر بگیرم؟
مرسی

MMSHFE
چهارشنبه 17 مهر 1392, 13:36 عصر
درمورد سؤال اول، GD فقط برای تصاویر کاربرد داره و برای PDF و... کلاسهای مناسب دیگه نوشته شده مثل PHPExcel و PDFLib و TCPDF و...
درمورد سؤال دوم هم باید MIME رو در تابع header تنظیم کنید. بطور کلی هدرها با MIME سروکار دارن و پسوند اهمیتی نداره چون فقط ویندوز به پسوند حساسه و در سایر سیستمهای عامل، از روی MIME و هدرهای فایلها، نوعشون تشخیص داده میشه.

mehsaa
چهارشنبه 17 مهر 1392, 13:45 عصر
خیلی ممنون
type منظورم چیزی هست که از $_FILES['file']['type'] میگیریم بود،
یه سوال دیگه اینکه توی لوکال فایلی و آپلود میکنم و mime که بهم نشون میده با چیزی که همون فایل و رو اینترنت آپلود میکنم و نشون میده فرق داره واسه همین اون صفحه ای و که برای نمایش فایل دارم با اینکه برای هدر Mime و در نظر گرفتم فایل و تو لوکال نشون میده ولی توی اینترنت بهم نشون نمیده، باید تو این مواقع چی کار کنم؟ مرسی

mehsaa
چهارشنبه 17 مهر 1392, 13:49 عصر
یه سوال دیگه هم دارم ببخشید
برای فایل هایی که در اصل php هستند ولی ظاهرشون عکس هست، اصلا این فایل ها چه حوری ساخته میشن؟ یعنی چطوری میشه یه فایل php رو یا تبدیل کرد به عکس بغیر از اینکه بخوایم فقط اسمشونو تغییر بدیم؟ و یا چه طور میشه کد php رو توی عکس بگنجونیم؟ مرسی

MMSHFE
چهارشنبه 17 مهر 1392, 13:51 عصر
اون type که میگین، همون MIME هست. من فکر کردم پسوند فایل رو میگین. درمورد سؤال بعدی هم که فکر میکنم یه جای دیگه هم مطرح شده بود، علتش اینه که سرورتون به احتمال زیاد لینوکس هست و MIME برخی فایلها مثل docx و... توی ویندوز و لینوکس فرق میکنه. شما باید طبق اطلاعات Agent کاربر، MIME مناسب رو براش تنظیم کنید. مقصر این ناهماهنگیها هم فقط و فقط مایکروسافته!

mehsaa
چهارشنبه 17 مهر 1392, 13:58 عصر
مرسی
مقداری که از $_FILES['file']['type']; و mime_content_type($_FILES['file']['tmp_name']); میگیرم دو تا مقدار جدا هست، پس فرق mime و type چیه؟
بله خودم پرسیده بودم این سوال رو، "طبق اطلاعات Agent کاربر" یعنی چی؟
بازم یه سوال دیگه ببخشید، برای validation ها، چه کاراکتری هست که باید از ورودشون جلوگیری کنم تا نشه کد php وارد فرم های ورودی بشه؟
مرسی

MMSHFE
چهارشنبه 17 مهر 1392, 14:42 عصر
دقت کنید که اولی بر اساس پسوند فایل داره تصمیم میگیره و دومی بر اساس اطلاعاتی که در یک فایل به اسم magic.mime در PHP ذخیره شده و ضمناً تاع mime_content_type منسوخ شده و بهتره از Extension مخصوص این کار یعنی FileInfo (http://www.php.net/manual/en/ref.fileinfo.php) استفاده کنید؛ هرچند همون اندیس type فایل آپلود شده کفایت میکنه. اطلاعات Agent کاربر هم توسط ['SERVER['HTTP_USER_AGENT_$ قابل دستیابیه.

mehsaa
چهارشنبه 17 مهر 1392, 15:16 عصر
مرسی
دستور echo $_SERVER['SERVER_NAME']; توی لوکال فقط بهم میده "localhost" و روی اینترنت میده "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36" از این دیتا چه جوری باید تشخیص بدم که چه Mime در نظر بگیرم؟

MMSHFE
چهارشنبه 17 مهر 1392, 16:20 عصر
این اطلاعات داره میگه ویندوز 7 نسخه 64 بیتی دارین و مرورگر شما Chrome نسخه 30.0.1599.69 هست. قبلاً یک کلاس برای تشخیص مرورگر و سیستم عامل از روی User Agent نوشته بودم که اگه توی تالار جستجو کنید، پیداش میکنید.

MMSHFE
چهارشنبه 17 مهر 1392, 16:25 عصر
کلاً Agent اگه خواستین ببینید چی میگه، تو این سایت وارد کنید:
http://www.useragentstring.com

MMSHFE
چهارشنبه 17 مهر 1392, 16:28 عصر
اینم فهرست کامل همه User Agent ها
http://www.useragentstring.com/pages/useragentstring.php

mehsaa
چهارشنبه 17 مهر 1392, 21:06 عصر
مرسی
راستش من متوجه نشدم الان این Agent چه ربطی داره به این موضوع، یعنی رو هر دستگاه با توجه به نوع سیستم عامل و بروزر، نوع هدری که در نظر میگیره فرق داره؟