|
PHP Upload File BLOB/Image to SQL Server Database (mssql-OPENROWSET) |
|
|
PHP Upload file SQL Server 2000,2005,2008 (BLOB Binary and Image Data Type) บทความ Script การใช้ PHP ทำการ Upload ไฟล์รูปภาพ ลงในฐานข้อมูล Column หรือ Fields ของ SQL Server โดยเก็บข้อมูลไฟล์ ในรูปแบบของ Binary Data ผ่าน Data Type Image ของ SQL Server ได้ทุกเวอร์ชั่น เช่น 2000, 2005, 2008
ความสามารถของ Script
- เก็บฟิวด์ชื่อและรูปภาพลงใน Binary Data SQL Server ผ่าน Data Type ชื่อ Image ของ SQL Server
- ใช้ Function ชื่อ OPENROWSET ของ SQL Server ในการแปลงข้อมูล Binary
- Form สำหรับ Upload ข้อมูลลงใน SQL Server
- Form สำหรับแสดงข้อมูลรูปภาพ ซึ่งดึงข้อมูล Binary Data จาก Image
- Form สำหรับการแก้ไขข้อมูลรูปภาพ และการบันทึกรูปภาพใหม่
ปกติแล้วการเก็บรูปภาพ หรืออัพโหลดรูปภาพจะนิยมทำการ Upload รูปภาพลงในโฟเดอร์ และมีการเก็บเพียงชื่อไฟล์หรือ path ลงใน SQL Server ซึ่งวิธีนี้จะสะดวกต่อการจับเก็บและการนำไปใช้ รวมทั้งป้องกันไม่เปลืองเนื้อที่ของ SQL Server ในการจัดเก็บด้วย ซึ่งการเรียกใช้งานก็สามารถอ้างอิงจาก Path ของรูปภาพได้เลย เช่น
Code
$image = "picture/win.jpg";
<img src="<?php echo $image;?>">
แต่ในกรณีที่เราจัดเก็บรูปภาพทั้งหมดที่ถูกแปลงเป็น Binary Data แล้วลงในฐานข้อมูล SQL Server จะไม่สามารถเรียกชื่อไฟล์นั้นได้โดงตรง เพราะข้อมูลที่ถูกจัดเก็บนั้นอยู่ในรูปแบบข้อมูล Binary แต่จะต้องสร้างไฟล์ php สำหรับอ่าน Binary Data และแปลงมาเป็นรูปภาพอีกขั้นตอนหนึ่ง จากนั้นก็อ้างอิง Path จากไฟล์ php นั้น ๆ เพื่อแสดงรูปภาพออกมาก
view.php
... $_GET["id"]; and Read image Binary From Table
Code
<img src="view.php?id=123">
จากตัวอย่างจะเห็นว่าเราจะต้องสร้างไฟล์ view.php ไว้อ่านค่ารูปภาพ โดยส่งค่าผ่าน id และเมื่อได้รูปภาพออกมาแล้ว ก็จะได้ค่า Binary กลับ และเมื่อเราใช้ tag <img> ในการรับค่า Binary ผลพัพธ์ก็จะแสดงรูปภาพนั้นออกมา วิธีนี้จะสามารถป้องกันการ Save รูปภาพผ่าน Web
Browser ได้อีกด้วย
การจัดเก็บข้อมูลรูปภาพผ่าน Binary ของ BLOB Type หรือ Image Type ไม่ค่อยได้รับความนิยม อันเนื่องจาก ประมาณการจัดเก็บและการนำไปใช้ค่อนข้างจะยาก และมีปัญหาเรื่อง Database บวม เมื่อข้อมูลรูปภาพมีปริมาณมาก
เริ่มต้นการทดสอบ
ให้สร้างตารางบนฐานข้อมูลของคุณดังนี้ ในที่นี้จะใช้ชื่อตารางว่า files
Table
USE [mydatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[files](
[FilesID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[FilesName] [image] NULL,
[FilesType] [varchar](20) NULL,
CONSTRAINT [PK_files] PRIMARY KEY CLUSTERED
(
[FilesID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
เอา Query นี้ไปรันเพื่อสร้างตารางข้อมูล โดยแก้ไขชื่อ database ตรง USE [mydatabase] ให้ถูกต้องจากนั้นก็รันได้เลย
ปรับแก้ไข php.ini นิดหนึ่งเพื่อให้รองรับปริมาณการอ่าน Binary Data ให้ได้มากหน่อย ถ้าใส่ตัวเลขน้อย ๆ เวลาภาพออกมาจะมีขนาดไม่สมบูรณ์ก็ได้ครับ คือภาพจะมาเท่ากับปริมาณที่ถูก Limi ไว้ที่ให้สามารอ่านได้ เช่นมาครึ่งเดียว หรือมาแต่หัว
php.ini
[MSSQL]
; Valid range 0 - 2147483647. Default = 4096.
mssql.textlimit = 2147483647
; Valid range 0 - 2147483647. Default = 4096.
mssql.textsize = 2147483647
เสร็จแล้ว Restart Apache Web Server ด้วยครับ
ViewImage.php
<?php
$objConnect = mssql_connect("localhost","sa","") or die("Error Connect to Database");
$objDB = mssql_select_db("mydatabase");
$strSQL = "SELECT * FROM files WHERE FilesID = '".$_GET["FilesID"]."' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
$objResult = mssql_fetch_assoc($objQuery);
header("Content-Type: ".$objResult["FilesType"]);
echo $objResult["FilesName"];
?>
PageUploadToSQLServer1.php
<html>
<head>
<title>ThaiCreate.Com Tutorial</title>
</head>
<body>
<form name="form1" method="post" action="PageUploadToSQLServer2.php" enctype="multipart/form-data">
Name : <input type="text" name="txtName"><br>
Picture : <input type="file" name="filUpload"><br>
<input name="btnSubmit" type="submit" value="Submit">
</form>
</body>
</html>
PageUploadToSQLServer2.php
<html>
<head>
<title>ThaiCreate.Com Tutorial</title>
</head>
<body>
<?php
if($_FILES["filUpload"]["name"] != "")
{
//*** Insert Record ***//
$objConnect = mssql_connect("localhost","sa","") or die("Error Connect to Database");
$objDB = mssql_select_db("mydatabase");
$strSQL = "INSERT INTO files ";
$strSQL .=" ( Name, FilesType,FilesName) ";
$strSQL .=" SELECT '".$_POST["txtName"]."','".$_FILES["filUpload"]["type"]."', ";
$strSQL .=" BulkColumn FROM OPENROWSET( ";
$strSQL .=" Bulk '".$_FILES["filUpload"]["tmp_name"]."', SINGLE_BLOB) AS BLOB ";
$objQuery = mssql_query($strSQL);
echo "Copy/Upload Complete<br>";
mssql_close($objConnect);
}
?>
<a href="PageUploadToSQLServer3.php">View files</a>
</body>
</html>
PageUploadToSQLServer3.php
<html>
<head>
<title>ThaiCreate.Com Tutorial</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
<body>
<?php
$objConnect = mssql_connect("localhost","sa","") or die("Error Connect to Database");
$objDB = mssql_select_db("mydatabase");
$strSQL = "SELECT * FROM files";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
?>
<table width="340" border="1">
<tr>
<th width="50"> <div align="center">Files ID </div></th>
<th width="150"> <div align="center">Picture</div></th>
<th width="150"> <div align="center">Name</div></th>
<th width="150"> <div align="center">Edit</div></th>
</tr>
<?php
while($objResult = mssql_fetch_array($objQuery))
{
?>
<tr>
<td><div align="center"><?php echo $objResult["FilesID"];?></div></td>
<td><center><img src="ViewImage.php?FilesID=<?php echo $objResult["FilesID"];?>"></center></td>
<td><center><?php echo $objResult["Name"];?></center></td>
<td><center><a href="PageUploadToSQLServer4.php?FilesID=<?php echo $objResult["FilesID"];?>">Edit</a></center></td>
</tr>
<?php
}
?>
</table>
<?php
mssql_close($objConnect);
?>
</body>
</html>
PageUploadToSQLServer4.php
<html>
<head>
<title>ThaiCreate.Com Tutorial</title>
</head>
<body>
<?php
$objConnect = mssql_connect("localhost","sa","") or die("Error Connect to Database");
$objDB = mssql_select_db("mydatabase");
$strSQL = "SELECT * FROM files WHERE FilesID = '".$_GET["FilesID"]."' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
$objResult = mssql_fetch_array($objQuery);
?>
<form name="form1" method="post" action="PageUploadToSQLServer5.php?FilesID=<?php echo $_GET["FilesID"];?>" enctype="multipart/form-data">
Edit Picture :<br>
Name : <input type="text" name="txtName" value="<?php echo $objResult["Name"];?>"><br>
<img src="ViewImage.php?FilesID=<?php echo $objResult["FilesID"];?>"><br>
Picture : <input type="file" name="filUpload"><br>
<input name="btnSubmit" type="submit" value="Submit">
</form>
</body>
<?php
mssql_close($objConnect);
?>
</html>
PageUploadToSQLServer5.php
<html>
<head>
<title>ThaiCreate.Com Tutorial</title>
</head>
<body>
<?php
//*** Update Record ***//
$objConnect = mssql_connect("localhost","sa","") or die("Error Connect to Database");
$objDB = mssql_select_db("mydatabase");
$strSQL = "UPDATE files ";
$strSQL .=" SET NAME = '".$_POST["txtName"]."' WHERE FilesID = '".$_GET["FilesID"]."' ";
$objQuery = mssql_query($strSQL);
if($_FILES["filUpload"]["name"] != "")
{
//*** Update New File ***//
$strSQL = "UPDATE files ";
$strSQL .=" SET FilesType = '".$_FILES["filUpload"]["type"]."', ";
$strSQL .=" FilesName = ";
$strSQL .=" BulkColumn FROM OPENROWSET( ";
$strSQL .=" Bulk '".$_FILES["filUpload"]["tmp_name"]."', SINGLE_BLOB) AS BLOB ";
$strSQL .=" WHERE FilesID = '".$_GET["FilesID"]."' ";
$objQuery = mssql_query($strSQL);
echo "Copy/Upload Complete<br>";
}
mssql_close($objConnect);
?>
<a href="PageUploadToSQLServer3.php">View files</a>
</body>
</html>
Screenshot
Form สำหรับการ Upload
Form สำหรับการแสดงข้อมูล
Form สำหรับการแก้ไขข้อมูล
จากตัวอย่างจะเห็นว่าเราไม่สามารถเรียกรูปภาพจาก tag <img> ได้โดยตรง แต่จะต้องมีการสร้างไฟล์ ViewImage.php โดยการส่งค่า ID ไปด้วย ไว้สำหรับอ่าน Binary Data ก่อน แล้วค่อยทำการส่งค่ากลับให้กับ Tag <img>
Code
<img src="ViewImage.php?FilesID=<?php echo $objResult["FilesID"];?>">
บทความอื่น ๆ ที่เกี่ยวข้อง
Go to : PHP SQL Server BLOB การ Upload และ Insert รูปภาพลงใน SQL Server mssql (BLOB,Image DataType)
Go to : ใครเคย upload รูปภาพ ลง database mssql (SQL Server Images BLOB) แล้ว ดึงมาแสดง บ้างครับ
Go to : PHP สร้างฟอร์มสำหรับ Upload รูปภาพลงในฐานข้อมูล MySQL พร้อมกับแบบ Form สำหรับการแก้ไขรูปภาพ
Go to : PHP Upload BLOB into Access Database (Access BLOB Binary)
Go to : PHP MySQL Multiple Upload File to MySQL Database - CreateElement Input File Upload
Go to : PHP MySQL Upload File to MySQL Database - Multiple Dynamic CreateElement Input File Upload
|
|
|
|
|
|
|
|
Score Rating : |
|
|
Create Date : |
2011-05-16 11:15:00 |
|
View : |
32,220 |
|
Download : |
No files
|
|
|
|
|
|
|
|