PDA

View Full Version : ذخیره خود عکس در پایگاه داده mysql



usernam
سه شنبه 10 آذر 1388, 00:25 صبح
چجوری میشه خود عکس (نه آدرس) رو توی database ذخیره کرد؟

امیـرحسین
سه شنبه 10 آذر 1388, 01:48 صبح
فکر کنم، با توابع file مثل readfile محتویات فایل رو می خونن و بصورت متن توی دیتابیس می ریزن.
برای نمایشش هم اون محتویات رو با header از نوع عکس نمایش میدن.
من تا حالا همچین چیزی رو تست نکردم ولی شاید روش همین باشه.

s_salavati2002
سه شنبه 10 آذر 1388, 07:24 صبح
همین طوریه که امیرحسین گفت،
هم میشه با آپلود درست کرد و هم با فایل تو سرور
فقط فیلد دیتابیست باید یکی از انواع blob باشه

funpatogh
شنبه 24 بهمن 1388, 00:35 صبح
نوع فیلد رو Blob کن و تا 4 گیگ اگه یادم باشه توی خودش ذخیره میکنه

mostafa_shaeri_tj
یک شنبه 26 اردیبهشت 1389, 11:49 صبح
سلام. بالاخره کدوم روش بهتره ؟ گذاشتن عکس در دیتا بیس یا آدرسش؟ شنیدم که لود کردن از دیتا بیس رو دچار مشکل میکنه. یعنی کمی سرعت پایین میاره و طوری هستش که حتی هاست هم دادش در میاد :متفکر:

یه سوال دیگه هم داشتم : با header از نوع عکس بخونیم یعنی چی و چطوری باید این کارو بکنیم؟

ممنون

trade_mark
یک شنبه 26 اردیبهشت 1389, 17:37 عصر
به نظر من اگه آدرس عکس رو در بانک ذخیره کنیم بهتر و سرعت برنامه بیشتر می شه
در ضمن محدودیتی هم از لحاظ اندازه فایل نداریم

pashaie
یک شنبه 26 اردیبهشت 1389, 18:40 عصر
یه سوال دیگه هم داشتم : با header از نوع عکس بخونیم یعنی چی و چطوری باید این کارو بکنیم؟

یعنی اینکه قبل از اینکه بخوای محتویات فایل رو واسه کلایت بفرستی، یه جوری به کلاینت حالی کنی که فایلی که داری مفرستی چه فرمتیه، چون پیش فرض همه رو html در نظر می گیره
مثلا اگه فایلی که ذخیره کردی png هست، قبل از ارسال خروجی باید کد زیر رو قرار بدی


header('Content-type: image/png');

در کل، ذخیره کردن خود تصویر تو دایرکتوری و آدرسش تو دیتا بیس بهتره تا اینکه کل فایل رو تو دیتا بیس ذخیره کنی

yaqubian
یک شنبه 26 اردیبهشت 1389, 23:01 عصر
دوست عزیز
ذخیره عکس در DB کلی هزینه واسه شما ایجاد می کنه!!! پس بهتره این کار رو انجام ندین.
مهمترین این هزینه ها، سرعت لود شدن تصاویر هنگام فراخونی صفحه است!
موفق باشید

omid_p30
سه شنبه 28 اردیبهشت 1389, 15:44 عصر
همونطور که بچه ها گفتن ذخیره عکس تو DB کار درستی نیست. کلا بهتره که عکس ها تو یه دایرکتوری رو سرور ذخیره بشن و فقط آدرس عکس ها داخل DB نگهداری بشه. قبلا سر این موضوع من یادمه تو یه جا خیلی بحث کردیم.
اما من خودم تو پروژه ام عکس هار رو تو DB ذخیره کردم و نشون دادم.
اما روش من این بود که داخل اون صفحه که می خاستم عکس هام رو نشون بدم داخل تگ img آدرس یه صفحه PHP رو دادم که عکس رو از DB می گرفت و نشون میداد.
مثلا صفحه اول که عکس رو میخاد نشون بده این کد رو داره

<img src="showpic.php?u_id='.$u_id.'">و صفحه دوم با نام showpic.php کد زیر رو داره.

<?php
include("mysql_connect.php");
if (isset($_GET['u_id']))
{
$u_id = $_GET['u_id'];
$query = "SELECT img FROM users where user_id = $u_id";
$result = mysql_query($query) or die('Error, query failed');
Header( "Content-type: image/jpeg");
while ($row = mysql_fetch_array($result))
{
echo $row['img'];
}
}
exit;
?>البته یادم رفت بگم که برای insert عکس داخل DB چیکار باید کنی.
پروژه من یه تالار گفتگو بود(البته خیلی ابتدایی). کلا من یه صفحه register داشتم که کاربر علاوه بر اطلاعات خودش می تونست عکس هم برای خودش بزاره. مثل همه فروم ها.
تو این صفحه من یه فرم داشتم که ورودی ها رو میگرفت و action فرم هم آدرس خود register.php بود. برای فرم HTML باید این کدها رو بزاری در واقع یه فیلد آپلود فایل لازم داری.


<form action="register.php" method= "post" enctype="multipart/form-data">
your picture:<input type="file" name="picup" id="picup"></br>
<input type="submit" name="submit" value="Register" />
<input type="hidden" name= "submitted" value="TRUE" />
</form>برای درج در DB هم باید فیلدی که میخای عکس رو داخلش دخیره کنی از نوع blob تعریف شده باشه.
و کد درج در DB هم اینه :


if($_FILES['picup']['size'] > 0)
{
$fileName = $_FILES['picup']['name'];
$tmpName = $_FILES['picup']['tmp_name'];
$fileSize = $_FILES['picup']['size'];
$fileType = $_FILES['picup']['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] > 150) || ($sizes[1] > 150)){
$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);
fclose($fp);
}

if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}

}else
{
echo '<p class="error">please select a picture for avatar!</p>';
}و این هم برای درج


$q = "INSERT INTO users (img) VALUES ('$content')";
$r = mysql_query ($q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysql_error() );


هر جا احتیاج به توضیح داشتی بگو.
موفق باشی.

sara_1234
دوشنبه 18 مرداد 1389, 12:11 عصر
به نظر من اگه آدرس عکس رو در بانک ذخیره کنیم بهتر و سرعت برنامه بیشتر می شه
در ضمن محدودیتی هم از لحاظ اندازه فایل نداریم

با سلام
میشه بگید ادرس عکس رو چه طوری تو mysqlذخیره می کنید ؟ با اپلود هست؟ میشه کدشو بهم بگید.ممنون

rapidpich
دوشنبه 18 مرداد 1389, 13:42 عصر
برای ذخیره عکس تو دیتابیس از نوع BLOB باید استفاده کنی.
برای اینکه دقیقا ببینی چطور اینکارو بکنی یه جستجو بکن با همین کلمات blob image mysql php
اگه عکسا کوچیک هست میتونی قبلش محتویات فایل رو Base64 کنی و اون رو ذخیره کنی.

idocsidocs
جمعه 28 آبان 1389, 00:24 صبح
همونطور که بچه ها گفتن ذخیره عکس تو DB کار درستی نیست. کلا بهتره که عکس ها تو یه دایرکتوری رو سرور ذخیره بشن و فقط آدرس عکس ها داخل DB نگهداری بشه. قبلا سر این موضوع من یادمه تو یه جا خیلی بحث کردیم.
اما من خودم تو پروژه ام عکس هار رو تو DB ذخیره کردم و نشون دادم.
اما روش من این بود که داخل اون صفحه که می خاستم عکس هام رو نشون بدم داخل تگ img آدرس یه صفحه PHP رو دادم که عکس رو از DB می گرفت و نشون میداد.
مثلا صفحه اول که عکس رو میخاد نشون بده این کد رو داره

<img src="showpic.php?u_id='.$u_id.'">و صفحه دوم با نام showpic.php کد زیر رو داره.

<?php
include("mysql_connect.php");
if (isset($_GET['u_id']))
{
$u_id = $_GET['u_id'];
$query = "SELECT img FROM users where user_id = $u_id";
$result = mysql_query($query) or die('Error, query failed');
Header( "Content-type: image/jpeg");
while ($row = mysql_fetch_array($result))
{
echo $row['img'];
}
}
exit;
?>البته یادم رفت بگم که برای insert عکس داخل DB چیکار باید کنی.
پروژه من یه تالار گفتگو بود(البته خیلی ابتدایی). کلا من یه صفحه register داشتم که کاربر علاوه بر اطلاعات خودش می تونست عکس هم برای خودش بزاره. مثل همه فروم ها.
تو این صفحه من یه فرم داشتم که ورودی ها رو میگرفت و action فرم هم آدرس خود register.php بود. برای فرم HTML باید این کدها رو بزاری در واقع یه فیلد آپلود فایل لازم داری.


<form action="register.php" method= "post" enctype="multipart/form-data">
your picture:<input type="file" name="picup" id="picup"></br>
<input type="submit" name="submit" value="Register" />
<input type="hidden" name= "submitted" value="TRUE" />
</form>برای درج در DB هم باید فیلدی که میخای عکس رو داخلش دخیره کنی از نوع blob تعریف شده باشه.
و کد درج در DB هم اینه :


if($_FILES['picup']['size'] > 0)
{
$fileName = $_FILES['picup']['name'];
$tmpName = $_FILES['picup']['tmp_name'];
$fileSize = $_FILES['picup']['size'];
$fileType = $_FILES['picup']['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] > 150) || ($sizes[1] > 150)){
$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);
fclose($fp);
}

if(!get_magic_quotes_gpc())
{
$fileName = addslashes($fileName);
}

}else
{
echo '<p class="error">please select a picture for avatar!</p>';
}و این هم برای درج


$q = "INSERT INTO users (img) VALUES ('$content')";
$r = mysql_query ($q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysql_error() );
هر جا احتیاج به توضیح داشتی بگو.
موفق باشی.


این اسکریپت که برای آپلود عکس نوشتید بخوبی کار می کنه، اما فقط وقتی که بخوایم یک عکس رو آپلود کنیم.

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

if($_FILES['picup']['size'] > 0)
{
$fileName = $_FILES['picup']['name'];
$tmpName = $_FILES['picup']['tmp_name'];
$fileSize = $_FILES['picup']['size'];
$fileType = $_FILES['picup']['type'];

funpatogh
جمعه 28 آبان 1389, 14:21 عصر
اگر برنامه رو کامل درک کرده باشید میتونید از الگوی زیر برای حل مشکل تک فایل استفاده کنید


<?php
foreach($_FILES['picup']['error'] as $key=>$error){
if($error==0){
$tmp_name=$_FILES['picup']['tmp_name'][$key];
$name=$_FILES['picup']['name'][$key];
}
}
?>