PDA

View Full Version : سوال: بازیابی عکس از پایگاه داده



prisa_srr
سه شنبه 15 فروردین 1391, 19:54 عصر
سلام دوستان
من میخوام از پایگاه داده ام عکسی رو که ذخیره کردم رو بازیابی کنم تو اینترنت خیلی سرچ کردم و اغلب پاسخ ها به این صورت بود که تو صفحه اول کد :

$id=$_POST['sid'];

$stmt = $dbh->prepare("select * from students where id='$id'");
$stmt->execute()or die('can not execute');
$stmt->execute();
while($arr_rs=$stmt->fetch()){

$name=$arr_rs['name'];
$fname=$arr_rs['fname'];
$image=$arr_rs['image'];
$phone=$arr_rs['phone'];
Header( "Content-type: image/jpeg");
echo '<tr>';
echo ' <td>'.$name.'</td><td>'.$fname.'</td><td></td><td>'.$phone.'</td><td><img src="showpic.php?id='.$id.'"></td>
</tr>';
//<img src="showpic.php?id='.$id.'">
//<img src =\"" . $arr_rs['image']."\">
} //while
و تو صفحه showpic.php کد :



if (isset($_GET['id']))
{
$id = $_GET['id'];

$query = "SELECT image FROM students where id = $id";
$stmt = $dbh->prepare($query);
$stmt->execute()or die('can not execute');
Header( "Content-type: image/jpeg");
$arr_rs=$stmt->fetch();

echo $arr_rs['image'];
}


رو بنویسم . منم همین کارو کردم و کدش رو گذاشتم اما عکس رو بهم همچنین نشون نمیده . نوع فیلد image رو هم blob ذخیره کردم به این صورت :


if(isset($_FILES['image']['size'])&& $_FILES['image']['size'] > 0){
echo 'in pic';
$fileName = $_FILES['image']['name'];
$tmpName = $_FILES['image']['tmp_name'];
$fileSize = $_FILES['image']['size'];
$fileType = $_FILES['image']['type'];
$sizes = getimagesize($tmpName);
if($fileType != 'image/jpeg'){
$content= false;
echo '<p class="error">The type of your picture is not jpeg. Please select a jpeg picture!</p>';
}
/*elseif (($sizes[0] > 250) || ($sizes[1] > 250)){
$content= false;
echo '<p class="error">The size of your picture is not valid. selected picture should be 150*150px!</p>';
}*/
else {
$fp = fopen($tmpName, 'r');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content); //$image
fclose($fp);
}



من $content رو در فیلد image درج کردم (البته من از رابط pdo برای اتصال به پایگاه داده در این کدها استفاده کردم)

به نظرتون مشکل از کجاست ؟

MMSHFE
چهارشنبه 16 فروردین 1391, 12:47 عصر
به هیچ عنوان ذخیره خود عکس رو بطور مستقیم توی DB پیشنهاد نمیکنم. فرض کنید یک عکس 800x600 دارین که با احتساب 24 بیت برای کانالهای RGB برای هر پیکسل، بدون درنظر گرفته هدرها و... 11,520,000 بیت یعنی حدود 10.9 مگابایت توی دیتابیس فضا لازم دارین که ذخیره بشه. همین رو اگه بصورت JPEG ذخیره کنید که یک فرمت فشرده است، در بدترین حالت حدود 300-200 کیلوبایت میشه یعنی با ذخیره در دیتابیس شما فضای هاست رو حداقل 30 برابر و حداکثر 1000 برابر بیشتر دارین مصرف میکنید. بهترین کار، نگهداری عکس با فرمت مناسب و ذخیره آدرس اون در دیتابیس هست. اگر هم میخواین عکسها رو نشه مستقیم نشون داد، روشهایی برای جلوگیری از این کار وجود داره. موفق باشید.

yones_safari
چهارشنبه 16 فروردین 1391, 12:54 عصر
به هیچ عنوان ذخیره خود عکس رو بطور مستقیم توی DB پیشنهاد نمیکنم. فرض کنید یک عکس 800x600 دارین که با احتساب 24 بیت برای کانالهای RGB برای هر پیکسل، بدون درنظر گرفته هدرها و... 11,520,000 بیت یعنی حدود 10.9 مگابایت توی دیتابیس فضا لازم دارین که ذخیره بشه. همین رو اگه بصورت JPEG ذخیره کنید که یک فرمت فشرده است، در بدترین حالت حدود 300-200 کیلوبایت میشه یعنی با ذخیره در دیتابیس شما فضای هاست رو حداقل 30 برابر و حداکثر 1000 برابر بیشتر دارین مصرف میکنید. بهترین کار، نگهداری عکس با فرمت مناسب و ذخیره آدرس اون در دیتابیس هست. اگر هم میخواین عکسها رو نشه مستقیم نشون داد، روشهایی برای جلوگیری از این کار وجود داره. موفق باشید.
+
در ضمن اگه فردا بخوای از پایگاه دادت پشتیبان بگیری با ارور کمبود حافظه رم مواجه میشی.اون موقع هستش که به فکر انتقال فایلها به هاست میوفتی.
این یک مورد رو خودم تو ویبولتین تجربه کردم.کلا هیچ وقت تو پایگاه فایل ذخیره نکن.
موفق باشی

prisa_srr
پنج شنبه 17 فروردین 1391, 11:19 صبح
بله حق با شماست اما این یه پروژه درسی و میخوام ابن نوعش رو یاد بگیرم . اگه به نتیجه ای نرسیدم از همون روش آدرس عکس استفاده میکنم . به هر حال اگه راهنماییم کنین ممنون میشم

MMSHFE
پنج شنبه 17 فروردین 1391, 11:29 صبح
اینجا (http://www.phpro.org/tutorials/Storing-Images-in-MySQL-with-PHP.html) رو ببینید. مرحله به مرحله آموزش داده شده. اگه باز هم مشکلی بود بفرمایید تا یک مثال آماده کنم. موفق باشید.

prisa_srr
پنج شنبه 17 فروردین 1391, 20:38 عصر
لینک رو دیدم . مشابه کدی بود که خودم نوشتم . من بازم تغییراتی رو که فکر میکردم مناسب باشه رو از رو نمونه کد اون لینک اصلاح کردم . اما باز عکس رو نشون نداد (مشکل من دقیقا نشون دادنش هست نه ذخیره کردن .) فکر نمیکنم کد مشکلی داره :افسرده:

MMSHFE
جمعه 18 فروردین 1391, 00:30 صبح
یک راه ساده وجود داره و اون، خوندن محتویات فایل بصورت زیر و ذخیره اطلاعات خونده شده توی دیتابیس هست:


$fp = fopen($image, 'rb');
$content = '';
while(!feof($fp)) {
$content .= fgetc($fp);
}
fclose($fp);

همونطور که میبینید، موقع خوندن فایل، بصورت باینری فایل رو باز میکنیم و کل محتواش رو میخونیم. حالا content$ تمام محتوای فایل رو داره. کافیه وقتی میخوایم نمایشش بدیم، بعد از خوندن از دیتابیس با کمک این کد نشونش بدیم:


header('Content-type: image/jpeg');
echo $content;

که توی کد فوق، content$ همون فیلد مربوط به عکس هست که از دیتابیس خوندیم و در مرحله قبل، محتوای عکس رو توش ذخیره کرده بودیم.
موفق باشید.

prisa_srr
جمعه 18 فروردین 1391, 18:06 عصر
فرق کد من اینه که فایل رو به این صورت میخونم :



$fp = fopen($tmpName, 'rb');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content); //$image
fclose($fp);


وقتی از کد شما استفاده میکنم نمیذاره که تو جدول insert بشه

بقیه موارد رو همونطور که گفته بودید انجام دادم . درست نشد

MMSHFE
جمعه 18 فروردین 1391, 18:19 عصر
خوب حالا که اینطوری توی دیتابیس ذخیره میکنید، موقع خوندن اول از stripslashes استفاده کنید تا کار addslashes خنثی بشه و بعد نشونش بدین.

prisa_srr
دوشنبه 21 فروردین 1391, 19:59 عصر
الان این کد که نوشتم درسته ؟ (موقع خوندن از پایگاه)



while($arr_rs=$stmt->fetch()){

$name=$arr_rs['name'];
$fname=$arr_rs['fname'];
$image=$arr_rs['image'];
$phone=$arr_rs['phone'];
Header( "Content-type: image/jpeg");
echo '<tr>';
echo ' <td>'.$name.'</td><td>'.$fname.'</td><td></td><td>'.$phone.'</td><td> '.stripslashes( $arr_rs['image'] ) .'</td>
</tr>';
} //while


خطا میده :

the image can not be displayed because it contains error

البته از این که اینقدر این پست طولانی شد شرمنده . :افسرده: :عصبانی++:

prisa_srr
دوشنبه 21 فروردین 1391, 22:06 عصر
راستی عکس من سایزش : 176 *220 و حجمش 8.96 kb هست . مشکل از عکس که نیست؟

MMSHFE
سه شنبه 22 فروردین 1391, 00:55 صبح
نه عکس مشکل نداره. شما نباید هیچ چیزی به جز محتوای عکس رو echo کنید. وجود اون td و... در خروجی باعث شده پیغام خطا دریافت کنید چون هدر Content-Type رو روی image/jpeg تنظیم کردین ولی محتوای غیر عکس echo کردین.

prisa_srr
چهارشنبه 23 فروردین 1391, 21:15 عصر
while($arr_rs=$stmt->fetch()){

$name=$arr_rs['name'];
$fname=$arr_rs['fname'];
$phone=$arr_rs['phone'];
$image= stripslashes( $arr_rs['image'] );
Header( "Content-type: image/jpeg");
echo $image;
} //while


بازم همون error رو داد

البته یه سوال . اگه بخوایم عکس رو در یکی از فیلدای یک جدول نشون بدیم چی ؟

MMSHFE
چهارشنبه 23 فروردین 1391, 23:03 عصر
نه دوست عزیز، نمیشه از حلقه while استفاده کنید. اسکریپت نمایش عکس هربار فقط میتونه یک تصویر نشون بده. اگه میشه کل کد رو ضمیمه کنید تا براتون اصلاحش کنم. موفق باشید.

omidamiry
پنج شنبه 24 فروردین 1391, 00:03 صبح
کد زیر در اکسس با نوع ole object جواب میده
------------------ save --------------------
try
{
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] bytes = ms.GetBuffer();
table1TableAdapter.Insert(bytes);

MessageBox.Show("Saved successful");
this.table1TableAdapter.Fill(this.qqqqDataSet.Tabl e1);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}


--------------------- red ----------------------
try
{
GC.Collect();//اين متد براي تخليه منابع سيستم فراخواني مي شود

MemoryStream ms = new MemoryStream((byte[])(table1TableAdapter.retrow().Rows[0][1]));

pictureBox2.Image = Image.FromStream(ms);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}

MMSHFE
پنج شنبه 24 فروردین 1391, 08:22 صبح
دوست عزیز موضوع این تاپیک ذخیره عکس توی دیتابیس MySQL و با کمک کدهای PHP هست نه ذخیره توی Access با کدهای #C
موفق باشید.

MMSHFE
پنج شنبه 24 فروردین 1391, 11:52 صبح
لطفاً اگه خواستین همه کدها رو ضمیمه کنید، یک Export از دیتابیس هم بگذارین تا روی اطلاعاتی که توی دیتابیس خودتون ذخیره شده کار کنم و کد دقیقاً همون چیزی بشه که میخواین. موفق باشید.

prisa_srr
پنج شنبه 24 فروردین 1391, 18:50 عصر
خیلی ممنون
منتها من table رو export کردم یه پایگاه داده به نام PdoStudents لازم هست.

table و فایل کد :
85627

prisa_srr
سه شنبه 12 اردیبهشت 1391, 14:33 عصر
بعد از یه مدت کلنجار رفتن با این مبحث بالاخره توسط یکی از دوستان خوبم این مشکل حل شد . گفتم اینجا بذارم تا همه استفاده کنند:
قراردادن عکس در پایگاه :


if(isset($_FILES['image']['size'])&& $_FILES['image']['size'] > 0){
//echo 'in pic';
$fileName = $_FILES['image']['name'];
$tmpName = $_FILES['image']['tmp_name'];
$fileSize = $_FILES['image']['size'];
$fileType = $_FILES['image']['type'];
$sizes = getimagesize($tmpName);
if($fileType != 'image/jpeg'){
//echo 'not jpeg';
$content= false;
echo '<p class="error">The type of your picture is not jpeg. Please select a jpeg picture!</p>';
}
elseif (($sizes[0] > 250) || ($sizes[1] > 250)){
$content= false;
echo '<p class="error">The size of your picture is not valid. selected picture should be 150*150px!</p>';
}
else {
//echo 'is jpeg';
$fp = fopen($tmpName, 'rb');
$content = fread($fp, filesize($tmpName));
$content = addslashes($content); //$image
fclose($fp);

$stmt = $dbh->prepare("insert into students(id,name,fname,phone,image) values ('$id','$name','$fname','$phone','$content')"); //----
mysql_query("SET SESSION collation_connection = 'utf8_persian_ci'") ;
$stmt->execute() or die(' can not insert'.mysql_error());
echo 'inserted successfully';
} //else
}//if image


بازیابی و نمایش عکس :



echo '<tr>';
echo " <td>".$name."</td><td>".$fname."</td><td>".$id."</td><td>".$phone."</td><td width=150><img src='data:image/jpeg;base64, ". base64_encode( $image ) . "' /></td>
</tr>";