ذخیره (آپلود تصاویر) در دیتابیس MySQL به کمک PHP
#1
Lightbulb 
به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
حتماً تا به حال بارها براتون پیش اومده که بخواین تصاویر رو در سرور خودتون برای مقاصد مختلفی ذخیره کنین تا بعداً در جایی که نیازه ازشون استفاده کنین. قبلاً راجع به نحوه آپلود فایل ها به کمک PHP از طریق محیط کانستراکت در این تاپیک صحبت کردیم. در تاپیک یاد شده بررسی کردیم که چطور میتونیم یک فایل رو از طریق شیء  File Chooser به یک دایرکتوری (پوشه) مشخص در سرور منتقل کنیم. امروز قصد داریم طریقه ذخیره سازی تصاویر (با هر فرمتی) رو در دیتابیس MySQL بررسی کنیم.
شرح مکانیزم ذخیره سازی تصاویر در دیتابیس:
تصاویر برای اینکه قابل ذخیره در دیتابیس باشند باید به فرمت Blob در بیایند. فرمت Blob در واقع تصویر موردنظر ما رو در دیتابیس به حالت باینری در میاره تا بتونیم اون رو در دیتابیس ذخیره کنیم. بعد از اینکه تصویر موردنظر ما توسط PHP به فرمت Blob تبدیل شد یک شناسه (آیدی) منحصر به فرد برای تصویری که قراره در دیتابیس ذخیره بشه توسط برنامه PHP ایجاد شده تا بتونیم هر زمان که نیاز بود تصاویر ذخیره شده در دیتابیس رو بازخوانی کنیم.
در واقع در اینجا دو برنامه (فایل) PHP داریم:
  • * فایل save.php: این فایل (برنامه) وظیفه ذخیره سازی تصاویر در دیتابیس رو بر عهده داره.
  • * فایل get.php: این فایل (برنامه) PHP وظیفه خوانش تصویر ذخیره شده در دیتابیس رو بر عهده داره. 
در ادامه مطلب به توضیح هر یک از برنامه ها (فایلهای) PHP ذکر شده میپردازیم.
فایل save.php :
قبل از هر چیز باید اطلاعات مربوط به دیتابیس خودمون رو در این فایل (برنامه) PHP ویرایش کنیم تا عملکرد برنامه به صورت صحیح انجام بشه.
مشخص کردن تنظیمات دیتابیس:
شما باید در خط 13 الی 16 این کد PHP اطلاعات مربوط به MySQL هاست یا سرور خودتون رو وارد کنید. یعنی در این قسمت:
کد:
// مشخصات سرور شما
$servername = "localhost";
$username = "root";
$password = "";
دقت کنید که این برنامه PHP یک دیتابیس به صورت کاملاً خودکار با الگوی زیر می سازد:
کد:
username_dbname
==============
username => نام کاربری مای اس کیو ال
dbname => نام دیتابیسی که قرار است ایجاد شود که در اینجا blobstorage است
ترکیبی از نام کاربری MySQL بودن نام دیتابیس رو به این دلیل اعمال کردم تا در استفاده از هاست های رایگان مشکلی نداشته باشید چرا که بیشتر هاست های رایگان از این رویه برای ساخت دیتابیس استفاده می کنند. 
بعد از اینکه دیتابیس ساخته شد، یک جدول به صورت خودکار توسط PHP با نام «data» ایجاد می شود که این جدول شامل سه ردیف ID ، Blob و Format می باشد.
ذخیره سازی تصویر موردنظر در دیتابیس MySQL:
خُب قصد داریم عملاً از این برنامه PHP بهره برداری کنیم. قبل از هر چیز باید بدونید که این فایل PHP رو باید در دایرکتوری (پوشه ای) قرار بدین که تصویر موردنظرتون موجود باشه. حالا برای ذخیره تصویر در دیتابیس کافیه شیء AJAX (اِی جَکس) رو به پروژه اضافه کنیم. اکشن Request URL این شیء را انتخاب می کنیم.  برای پارامتر  Tag می توانید یک مقدار دلخواه در نظر بگیرید. مقدار پارامتر  URL رو هم به شکل زیر تعیین کنید:
کد:
http://yourhost.com/save.php?filename=X
در ریکوئستی که به فایل PHP ارسال می کنیم تنها یک پارامتر تحت عنوان filename داریم. مقدار این پارامتر باید برابر با نام و فرمت فایل باشد مثلاً  image.png . بعد از ارسال ریکوئست میتونیم به کمک اکسپرشن AJAX.Lastdata مقدار برگشت داده شده از جانب PHP رو دریافت کنیم.

خطاها و ارورهای فایل save.php :
  • در صورتی که هیچ مقداری برای پارامتر filename در نظر گرفته نشده باشد پیغام A و در صورتی که مقدار وارد شده برای پارامتر filename در دایرکتوری موجود نباشد پیغام B در خروجی چاپ خواهد شد:
کد:
A => You should enter the file name.
B => The file does not exist.
  • در صورتی که مقدار وارده برای پارامتر filename تصویر نباشد پیغام زیر در خروجی چاپ خواهد شد:
کد:
The selected file is not a picture.
  • در صورتی که پروسه موفقیت آمیز باشد و همه چیز به خوبی پیش برود پیغام زیر که حاکی از موفقیت آمیز بودن پروسه است در خروجی چاپ خواهد شد:
کد:
Done!
The File ID: X
(عبارت X بیانگر شناسه منحصر به فرد فایل ذخیره شده در دیتابیس است که برای بازخوانی تصویر از دیتابیس به آن نیاز داریم.)
کدهای فـایل save.php :
کد php:
<?php
/**
* @author Master Badfar
* @copyright 2020
* ذخیره فایل در پایگاه داده MySQL
* انجمن تخصصی کانستراکت 2
*/
// صدور مجوز برای AJAX
header('Access-Control-Allow-Origin: *');
// قطع نمایش خطاهای مفسر
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// مشخصات سرور شما
$servername "localhost";
$username "root";
$password "";
// متغیر میزان ارور
$error 0;
// در صورتی که مـقدار پـارامتر فایل خالی بود ارور بده و همچنین پیغامی نمایش بده
if (empty($_GET['filename'])) {
    echo "You should enter the file name." '</br>';
    $error++;
    // اگر فایل ذکر شده موجود نبود ارور بده
} elseif (!file_exists($_GET['filename'])) {
    echo "The file does not exist." '</br>';
    $error++;
}
// ساخت دیتابیس در صورت موجود نبودن
try {
    $conn = new PDO("mysql:host=$servername"$username$password);
    $conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    $db $username "_" "blobstorage";
    $sql "CREATE DATABASE IF NOT EXISTS $db";
    $conn->exec($sql);
} catch (
PDOException $e) {
    echo $sql "<br>" $e->getMessage();
    $error++;
}
$conn null;
// ساخت جدول دیتابیس در صورت موجود نبودن
try {
    $conn = new PDO("mysql:host=$servername;dbname=$db"$username$password);
    $conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
    $sql "CREATE TABLE IF NOT EXISTS `data` (
    `ID` VARCHAR( 35 )  ,
    `Blob` BLOB NOT NULL      ,
    `Format` VARCHAR( 20 )
)"
;
    $conn->exec($sql);
} catch (
PDOException $e) {
    echo $sql "<br>" $e->getMessage();
    $error++;
}
$conn null;
// تعریف تابع سازنده شناسه فایل و بررسی کننده منحصر به فرد بودن شناسه ایجاد شده
function Create_ID()
{
    return md5(openssl_random_pseudo_bytes(940));
}
function 
check_query($v)
{
    global $db;
    global $servername;
    global $username;
    global $password;
    $con mysqli_connect($servername$username$password$db);
    $query "SELECT * FROM data WHERE ID = '$v'";
    $results mysqli_query($con$query);
    $rows mysqli_num_rows($results);
    if ($rows == 0) {
        return true;
    } else if ($rows != 0) {
        return false;
    }
    mysqli_close($con);
}
// در صورتی که اروری نداشتیم
// استفاده از توابع تعریف شده برای ساخت یک شناسه (ID) منحصر به فرد
if ($error == 0){
$token Create_ID();
while (!
check_query($token)) {
    $token Create_ID();
}
// ذخیره فرمت فایل در یک متغیر
$format mime_content_type($_GET['filename']);
$content file_get_contents($_GET['filename']);
// تبدیل فایل وارده به فرمت BLOB و ارسال اطلاعات به دیتابیس
if (@is_array(getimagesize($_GET['filename']))){
$dbh = new PDO ("mysql:host=$servername;dbname=$db$username $password);
$stmt $dbh->prepare("insert into data values (?,?,?)");
$stmt->bindParam($token);
$stmt->bindParam($content);
$stmt->bindParam($format);
$r $stmt->execute();
$dbh null;
if (
$r){
echo 
"Done!" '</br>' "The File ID: " $token;
}elseif (!
$r){
    echo "Error Uploading file!" '</br>';
    echo $content;
}
}else{
    echo "The selected file is not a picture." '</br>';
    $error++;
}
}
?>

فایل get.php :
قبل از هر چیز باید اطلاعات مربوط به دیتابیس خودمون رو در این فایل (برنامه) PHP ویرایش کنیم تا عملکرد برنامه به صورت صحیح انجام بشه.
مشخص کردن تنظیمات دیتابیس:
شما باید در خط 13 الی 16 این کد PHP اطلاعات مربوط به MySQL هاست یا سرور خودتون رو وارد کنید. یعنی در این قسمت:
کد:
// مشخصات سرور شما
$servername = "localhost";
$username = "root";
$password = "";
بازخوانی تصویر موردنظر ذخیره شده در دیتابیس MySQL:
 برای اینکه بتونیم تصویر ذخیره شده رو در یک اسپرایت نمایش بدیم میتونیم یک اسپرایت دلخواه مخصوص این کار به پروژه اضافه کنیم و بعد به کمک اکشن  Load Image From URL اسپرایت ایجاد شده آدرس زیر را در فیلد  URI این اکشن وارد می کنیم:
کد:
http://yourhost.com/get.php?id=X
در ریکوئستی که به فایل PHP ارسال می کنیم تنها یک پارامتر تحت عنوان id داریم. مقدار این پارامتر باید برابر با شناسه منحصر به فرد (آیدی) به دست آمده در مرحله ذخیره سازی باشد. دقت کنید در صورتی که مایل بودیم تصویر ذخیره شده در دیتابیس را حذف کنیم کافی است پارامتر del را به آدرس ریکوئست اضافه کنیم و مقدار آن را دقیقاً برابر با  yes قرار دهیم. پس در صورت استفاده از پارامتر del آدرس ریکوئست به شکل زیر خواهد شد:
کد:
http://yourhost.com/get.php?id=X&del=yes
در صورتی که قصد دارید ابعاد (سایز) تصویر محدود به ابعاد اسپرایت باشد (تصویر با هر اندازه ای صرفاً در ابعاد اسپرایت نمایش داده شود) می توانید گزینه  Keep current size را از قسمت size انتخاب کنید. همچنین در صورتی که قصد دارید ابعاد اسپرایت به اندازه تصویر افزایش پیدا کند (تصویر در اندازه واقعی خود نمایش داده شود) گزینه  Resize to image size را از قسمت size انتخاب کنید.
خطاها و ارورهای فایل get.php :
  • در صورتی که هیچ مقداری برای پارامتر id در نظر گرفته نشده باشد پیغام A و در صورتی که شناسه وارد شده برای پارامتر id در دیتابیس موجود نباشد پیغام B در خروجی چاپ خواهد شد:
کد:
A => You should enter the file ID.
B => Invalid ID.
دقت کنید که با استفاده از روش فوق قادر به دریافت پیام های متنی نیستیم و تنها قادر به دریافت تصویر خروجی هستیم.
کدهای فـایل get.php :
کد php:
<?php
/**
* @author Master Badfar
* @copyright 2020
* ذخیره فایل در پایگاه داده MySQL
* انجمن تخصصی کانستراکت 2
*/
// صدور مجوز برای AJAX
header('Access-Control-Allow-Origin: *');
// قطع نمایش خطاهای مفسر
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// مشخصات سرور شما
$servername "localhost";
$username "root";
$password "";
// متغیر میزان ارور
$error 0;
// بررسی خالی بودن یا نبودن پارامتر ID
if (empty($_GET['id'])){
    echo "You should enter the File ID." "<br>";
    $error++;
}
$db $username "_" "blobstorage";
$id $_GET['id'];
// کدهای مربوط به حذف ID موردنظر
if ($_GET['del'] == 'yes' && !empty($_GET['id'])){
    $dbh = new PDO ("mysql:host=$servername;dbname=$db$username $password);
    $d $dbh->prepare("DELETE FROM data WHERE ID=?");
    $d->bindParam($id);
    $r $d->execute();
    if ($r){
        echo "The entered ID was deleted.";
    }
    $dbh null;
}
// نمایش ID موردنظر در خروجی
if (!empty($_GET['id']) && $_GET['del'] != 'yes'){
    $dbh = new PDO ("mysql:host=$servername;dbname=$db$username $password);
$stat $dbh->prepare("select * from data where ID=?");
$stat->bindParam($id);
$stat->execute();
$row $stat->fetch();
if (!empty(
$row['ID'])){
    header('Content-Type:' $row['Format']);
echo 
$row['Blob'];
}elseif (empty(
$row['ID'])){
   echo "Invalid ID." "<br>";
   $error++;
}
$dbh null;
}
?>

جمع بندی و پـایـان:
در این تاپیک بررسی کردیم که چطور قادر به ذخیره سازی تصاویر با فرمت های مختلف در دیتابیس هستیم. باید دقت داشته باشین که ذخیره سازی تصاویر و فایلها در دیتابیس های  SQL کار استانداردی نیست و بهتره مسیر دایرکتوری فایل موردنظر در سرور یا هاست رو در دیتابیس ذخیره کنیم تا اینکه خود فایل رو ذخیره سازی کنیم. ذخیره سازی تصاویر با فرمت  jpg به کمک این شیوه به راحتی و با کیفیت بسیار بالا انجام می شود اما ذخیره سازی تصاویر با فرمت  png ممکن است با اُفت کیفیت مواجه شود. امکان ذخیره سازی متحرک تصاویر  gif در این روش به علت متشکل بودن این دسته از تصاویر از چندین فریم وجود ندارد و تنها اولین فریم تصویر متحرک (گیف) ذخیره می گردد. در ضمن این شیوه برای ذخیره سازی تصاویر حجیم مناسب نخواهد بود.
امیدوارم این مطلب براتون مفید واقع شده باشه...
خوشحال میشم اگر جایی اشتباه و یا گُنگ بیان شده حتماً در ادامه به بنده گوشزد کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: S.L.F ، kakmamad ، amin hosseini ، ᔕinaᗪehghani


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,823 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,553 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,963 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,610 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,627 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: