به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
حتماً تا به حال بارها براتون پیش اومده که بخواین تصاویر رو در سرور خودتون برای مقاصد مختلفی ذخیره کنین تا بعداً در جایی که نیازه ازشون استفاده کنین. قبلاً راجع به نحوه آپلود فایل ها به کمک PHP از طریق محیط کانستراکت در این تاپیک صحبت کردیم. در تاپیک یاد شده بررسی کردیم که چطور میتونیم یک فایل رو از طریق شیء File Chooser به یک دایرکتوری (پوشه) مشخص در سرور منتقل کنیم. امروز قصد داریم طریقه ذخیره سازی تصاویر (با هر فرمتی) رو در دیتابیس MySQL بررسی کنیم.سلام دوستان امیدوارم حالتون خوب باشه...
شرح مکانیزم ذخیره سازی تصاویر در دیتابیس:
تصاویر برای اینکه قابل ذخیره در دیتابیس باشند باید به فرمت Blob در بیایند. فرمت Blob در واقع تصویر موردنظر ما رو در دیتابیس به حالت باینری در میاره تا بتونیم اون رو در دیتابیس ذخیره کنیم. بعد از اینکه تصویر موردنظر ما توسط PHP به فرمت Blob تبدیل شد یک شناسه (آیدی) منحصر به فرد برای تصویری که قراره در دیتابیس ذخیره بشه توسط برنامه PHP ایجاد شده تا بتونیم هر زمان که نیاز بود تصاویر ذخیره شده در دیتابیس رو بازخوانی کنیم.
در واقع در اینجا دو برنامه (فایل) PHP داریم:
- * فایل save.php: این فایل (برنامه) وظیفه ذخیره سازی تصاویر در دیتابیس رو بر عهده داره.
- * فایل get.php: این فایل (برنامه) PHP وظیفه خوانش تصویر ذخیره شده در دیتابیس رو بر عهده داره.
فایل save.php :
قبل از هر چیز باید اطلاعات مربوط به دیتابیس خودمون رو در این فایل (برنامه) PHP ویرایش کنیم تا عملکرد برنامه به صورت صحیح انجام بشه.
مشخص کردن تنظیمات دیتابیس:
شما باید در خط 13 الی 16 این کد PHP اطلاعات مربوط به MySQL هاست یا سرور خودتون رو وارد کنید. یعنی در این قسمت:
کد:
// مشخصات سرور شما
$servername = "localhost";
$username = "root";
$password = "";
کد:
username_dbname
==============
username => نام کاربری مای اس کیو ال
dbname => نام دیتابیسی که قرار است ایجاد شود که در اینجا blobstorage است
بعد از اینکه دیتابیس ساخته شد، یک جدول به صورت خودکار توسط PHP با نام «data» ایجاد می شود که این جدول شامل سه ردیف ID ، Blob و Format می باشد.
ذخیره سازی تصویر موردنظر در دیتابیس MySQL:
خُب قصد داریم عملاً از این برنامه PHP بهره برداری کنیم. قبل از هر چیز باید بدونید که این فایل PHP رو باید در دایرکتوری (پوشه ای) قرار بدین که تصویر موردنظرتون موجود باشه. حالا برای ذخیره تصویر در دیتابیس کافیه شیء AJAX (اِی جَکس) رو به پروژه اضافه کنیم. اکشن Request URL این شیء را انتخاب می کنیم. برای پارامتر Tag می توانید یک مقدار دلخواه در نظر بگیرید. مقدار پارامتر URL رو هم به شکل زیر تعیین کنید:
کد:
http://yourhost.com/save.php?filename=X
خطاها و ارورهای فایل 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
کدهای فـایل 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_ERRMODE, PDO::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_ERRMODE, PDO::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(1 , $token);
$stmt->bindParam(2 , $content);
$stmt->bindParam(3 , $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 = "";
برای اینکه بتونیم تصویر ذخیره شده رو در یک اسپرایت نمایش بدیم میتونیم یک اسپرایت دلخواه مخصوص این کار به پروژه اضافه کنیم و بعد به کمک اکشن Load Image From URL اسپرایت ایجاد شده آدرس زیر را در فیلد URI این اکشن وارد می کنیم:
کد:
http://yourhost.com/get.php?id=X
کد:
http://yourhost.com/get.php?id=X&del=yes
خطاها و ارورهای فایل 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(1 , $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(1 , $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 در این روش به علت متشکل بودن این دسته از تصاویر از چندین فریم وجود ندارد و تنها اولین فریم تصویر متحرک (گیف) ذخیره می گردد. در ضمن این شیوه برای ذخیره سازی تصاویر حجیم مناسب نخواهد بود.
امیدوارم این مطلب براتون مفید واقع شده باشه...
خوشحال میشم اگر جایی اشتباه و یا گُنگ بیان شده حتماً در ادامه به بنده گوشزد کنین.
با آرزوی بهترین ها...