PDA

View Full Version : آموزش: ذخیره تصاویر در MySQL و نمایش آنها با PHP قسمت دوم



P.H.P.
سه شنبه 16 شهریور 1389, 15:39 عصر
این آموزش ادامه قسمت اول روش ذخیره تصاویر در بانک اطلاعاتی است

همانطور که گفته شد این روش برای ذخیره تصاویر خاص مانند ذخیره: تصویر کاربر، لوگو و تصاویر کم حجم بیشتر استفاده خواهد شد.

حتما طبق روش قبل حجم تصویر و سایز آن را محدود کنید.

خوب اول از همه باید ارتباط با پایگاه داده را انجام دهیم؛ که این در آموزشهای قبل مختصر توضیح داده شد. برای اطلاعات بیشتر کلیک کنید. (http://www.vvolf.net/Action/programming/%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%d8%a7-mysql-%d8%af%d8%b1-php/)

همانطور که به یاد دارید در قسمت اول این آموزش، در هنگام طراحی جدول فیلدی برای نوع فایل به اسم imgType معرفی کردیم، این فیلد برای نمایش یا دانلود فایل نقش بسیار مهمی دارد.

من نمایش فایل را با استفاده از فایل image.php انجام خواهم داد، برای مثال اگر بخوایم رکورد 2 را نمایش دهیم به این صورت عمل میکنیم




image.php?id=2

به این صورت هر شماره ورودی در متد id تصویر آن رکورد را نمایش میدهد

http://www.vvolf.net/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif
برای دریافت ورودی از GET استفاده میکنیم



$image = $_GET["id"];

در نتیجه ورودی در متغیر image قرار میگیرد

این به تنهایی اصلا صحیح نیست، و میتواند مشکلات امنیتی از نظیر SQL Injection به وجود آورد پس باید ورودی را کنترول و محدود کنیم، ما در اینجا از تابع intval استفاده کردیم، شما میتوانید از filter در php یا توابع پاکسازی اعداد برای این کار استفاده کنید. (پس حتما در qeury پاکسازی را انجام دهید.)

به کد زیر دقت کنید و آن را در فایل image.php ذخیره کنید:


<?php

$id = intval($_GET["id"]);
if(isset($id))
{
$query = "SELECT * FROM tblImages WHERE imgID = '$id'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);

if(mysql_num_rows($result) == 1)
{
header("Content-Type: " . $row["imgType"]);

exit($row["imgImage"]);
}
else
{
$path = "images/notfound.jpg";

$image = imagecreatefromjpeg($path);

header("Content-Type: image/jpeg");

imagejpeg($image);

imagedestroy($image);
}
}

?>


شرط ما برای نمایش:



$id = intval($_GET["id"]);
if(isset($id))

isset: تعیین کننده ی قرارگرفتن مقدار در متغیر است؛ در صورتی که قرار گرفته باشد این مقدار True خواهد شد در غیر این صورت False میشود.

intval: مقدار عدد صحیح یک متغیر را دریافت میکند.


از mysql_num_rows برای موجود بودن درخواست استفاده کردیم




if(mysql_num_rows($result) == 1)

در این شرط ما گفتیم در صورتی که query گرفته شده برابر با 1 (موجود بودن رکورد) بود آنگاه ....


header("Content-Type: " . $row["imgType"]);

exit($row["imgImage"]);
تابع header برای ارسال هیدر در شناسایی نوع محتوا کاربرد دارد.

Content-Type: مشخص کردن در شناسایی نوع خروجی، این نوع از رکورد انتخاب شده از فیلد imgType مشخص میشود.

exit: نمایش خروجی و خاتمه ی اسکریپت

حالا اگر رکورد وجود نداشت چکار باید انجام دهیم؟



$path = "images/notfound.jpg";

$image = imagecreatefromjpeg($path);

header("Content-Type: image/jpeg");

imagejpeg($image);

imagedestroy($image);

در اینجا از GD برای نمایش تصویر Not Found استفاده میکنیم. تصویر notfound.jpg در پوشه images در صورتی که رکورد به هر دلیلی موجود نبود نمایش داده خواهد شد.

و در آخر برای نمایش تصاویر از کد HTML زیر استفاده خواهیم کرد.



<img src="image.php?id=2">

این تصویر نمایش رکورد 2 از بانک اطلاعاتی خواهد بود.

شاید بگویید که چرا سایز تصویر را در قسمت اول آموزش ذخیره کردیم؟، این فیلد را میتوانید برای مدیریت بهتر تصاویر داشته باشید یا اینکه بخواهید بخشی برای دانلود تصاویر از طریق بانک اطلاعاتی در سایت قرار دهید، با این حال میتوانید با قرار دادن "Content-Length" و "Content-Disposition: attachment" در تابع header بافراخوانی لینک، فایل را دریافت کنید.

منبع: http://www.Vvolf.net (http://www.vvolf.net/)

موفق

$ M 3 H R D A D $
جمعه 16 مهر 1389, 15:31 عصر
سلام من اسم حدول و تغییر دادم و سایز هم محدودیت و تغییر دادم

این کد :

<?php

$iSize = 10000;

$iWidth = 200;

$iHeight = 200;

if((isset($_FILES["image"])) && ($_FILES["image"]["size"] > 0))
{
$imgSize = $_FILES["image"]["size"];
$imgType = $_FILES["image"]["type"];
$tmpName = $_FILES["image"]["tmp_name"];

if($imgSize > $iSize)
exit("Error: Large file size.");

$getImgSize = getimagesize($tmpName);

if(!$getImgSize)
exit("Error: Invalid Image File.");

list($width, $height) = $getImgSize;

if(($width > $iWidth) || ($height > $iHeight))
exit("Maximum width and height exceeded. Please upload images below 100x100px size");

$fp = fopen($tmpName, 'r');
$imageName = fread($fp, filesize($tmpName));

if(!get_magic_quotes_gpc())
$imageName = addslashes($imageName);

fclose($fp);

$date = date("Y-m-d H:i:s");
$link = mysql_connect("localhost","csa_admin","admin");
if(!$link)
{
die('not connect'.mysql_error());
}
if(!mysql_select_db('admin_csauserinfo',$link))
echo "db selector error";
$q = "insert into img (imgType,imgImage,imgSize,imgDate) values ('$imgType','$imageName','$imgSize','$date')";
$result = mysql_query($q);
if($result)
echo "Your file has been uploaded.";

}

?>


اما تو بانک ذخیره نمیکنه انواع insert و تست مردم اما نمیدونم کجاش مشکله
و مرسی بابت آموزش
سوال دیگه اینکه
من این سه هدر و دادم تو نمایش :



header("Content-Type: " . $row["imgType"]);
header("Content-Length: " . $row["imgSize"]);
header("Content-Disposition: attachment");




اما موقع ذخیره با پسوند php ذخیره میکنه چیکار باید کرد ؟

$ M 3 H R D A D $
جمعه 16 مهر 1389, 15:32 عصر
راستی من میخوام تصویر و تو تگ img نشون بدم میشه بگین چجوریه ؟

funpatogh
جمعه 16 مهر 1389, 17:59 عصر
header("Content-Disposition: attachment");
به این شکل بنویس


header("Content-Disposition: attachment;filename=".$row['imgImage']);



راستی من میخوام تصویر و تو تگ img نشون بدم میشه بگین چجوریه ؟



<img src=file.php>

fs1376
چهارشنبه 22 خرداد 1398, 11:27 صبح
سلام
منم تمام کد ها رو مل همینجا نوشته داخل بانک اطلاعاتیم ذخیره میشه اما نمایش نمیده عکس رو فقط همین صفحه میاد خواهش میکنم بگین چیکار کنم:افسرده:
150353