Sunday, September 30, 2012

PHP Upload Oracle and BLOB


PHP Upload Oracle and BLOB (Binary Data) ตัวอย่างการใช้ PHP กับ Oracle ทำการ Upload Picture ไฟล์รูปภาพ ลงในฐานข้อมูล Column หรือ Fields ของ Oracle โดยเก็บข้อมูลในรูปแบบของ BLOB Binary Data ผ่าน Data Type BLOB ของ Oracle Database


ความสามารถของ Script
- เก็บฟิวด์ชื่อและรูปภาพลงใน Binary Data ผ่าน Data Type ชื่อ BLOB ของ Oracle
- Form สำหรับ Upload ข้อมูลลงใน Oracle
- Form สำหรับแสดงข้อมูลรูปภาพ ซึ่งดึงข้อมูล Binary Data จาก Image
- Form สำหรับการแก้ไขข้อมูลรูปภาพ และการบันทึกรูปภาพใหม่

ปกติแล้วการเก็บรูปภาพ หรืออัพโหลดรูปภาพจะนิยมทำการ Upload รูปภาพลงในโฟเดอร์ และมีการเก็บเพียงชื่อไฟล์หรือ path ลงใน Oracle ซึ่งวิธีนี้จะสะดวกต่อการจับเก็บและการนำไปใช้ รวมทั้งป้องกันไม่เปลืองเนื้อที่ของ Oracle Database ในการจัดเก็บด้วย ซึ่งการเรียกใช้งานก็สามารถอ้างอิงจาก Path ของรูปภาพได้เลย เช่น

Code

1.$image = "picture/win.jpg";
2.<img src="<?=$image;?>">


แต่ในกรณีที่เราจัดเก็บรูปภาพทั้งหมดที่ถูกแปลงเป็น Binary Data แล้วลงในฐานข้อมูล Oracle จะไม่สามารถเรียกชื่อไฟล์นั้นได้โดงตรง เพราะข้อมูลที่ถูกจัดเก็บนั้นอยู่ในรูปแบบข้อมูล Binary แต่จะต้องสร้างไฟล์ php สำหรับอ่าน Binary Data และแปลงมาเป็นรูปภาพอีกขั้นตอนหนึ่ง จากนั้นก็อ้างอิง Path จากไฟล์ php นั้น ๆ เพื่อแสดงรูปภาพออกมาก

view.php
1.... $_GET["id"]; and Read image Binary From Table

Code
1.<img src="view.php?id=123">


จากตัวอย่างจะเห็นว่าเราจะต้องสร้างไฟล์ view.php ไว้อ่านค่ารูปภาพ โดยส่งค่าผ่าน id และเมื่อได้รูปภาพออกมาแล้ว ก็จะได้ค่า Binary กลับ และเมื่อเราใช้ tag <img> ในการรับค่า Binary ผลพัพธ์ก็จะแสดงรูปภาพนั้นออกมา วิธีนี้จะสามารถป้องกันการ Save รูปภาพผ่าน Web Browser ได้อีกด้วย

การจัดเก็บข้อมูลรูปภาพผ่าน Binary ของ BLOB Type หรือ Image Type ไม่ค่อยได้รับความนิยม อันเนื่องจาก ประมาณการจัดเก็บและการนำไปใช้ค่อนข้างจะยาก และมีปัญหาเรื่อง Database บวม เมื่อข้อมูลรูปภาพมีปริมาณมาก


เริ่มต้นการทดสอบ

ให้สร้างตารางบนฐานข้อมูลของคุณดังนี้ ในที่นี้จะใช้ชื่อตารางว่า files

Table
-- Create table files
create table files
(
FilesID number,
Name varchar2(100),
FilesName blob,
FilesType varchar2(20)
)
;
-- Create/Recreate primary, unique and foreign key constraints
alter table files
add constraint PK_FilesID primary key (FILESID);

-- Create sequence
create sequence seq_next_filesid
minvalue 1
maxvalue 999999
start with 1
increment by 1;


เอา Query นี้ไปรันเพื่อทำการสร้างตารางและ sequence สำหรับ Auto Number


ส่วน Code ทั้งหมดตามนี้เลยครับ


ViewImage.php
01.<?
02.$objConnect = oci_connect("myuser","mypassword","TCDB");
03.$strSQL = "SELECT * FROM FILES WHERE FILESID = '".$_GET["FilesID"]."' ";
04.$objParse = oci_parse ($objConnect, $strSQL);
05.oci_execute ($objParse,OCI_DEFAULT);
06.$objResult = oci_fetch_array($objParse);
07. 
08.header("Content-Type: ".$objResult["FILESTYPE"]);
09.echo $objResult["FILESNAME"]->load();
10.?>


PageUploadToOracle1.php
01.<html>
02.<head>
03.<title>ThaiCreate.Com Tutorial</title>
04.</head>
05.<body>
06.<form name="form1" method="post" action="PageUploadToOracle2.php" enctype="multipart/form-data">
07.Name : <input type="text" name="txtName"><br>
08.Picture : <input type="file" name="filUpload"><br>
09.<input name="btnSubmit" type="submit" value="Submit">
10.</form>
11.</body>
12.</html>


PageUploadToOracle2.php
01.<html>
02.<head>
03.<title>ThaiCreate.Com Tutorial</title>
04.</head>
05.<body>
06.<?
07.if($_FILES["filUpload"]["name"] != "")
08.{
09. 
10.//*** Insert Record ***//
11.$objConnect = oci_connect("myuser","mypassword","TCDB");
12.$lob = oci_new_descriptor($objConnect, OCI_D_LOB);
13.$strSQL = "INSERT INTO FILES ";
14.$strSQL .="(FILESID,NAME,FILESTYPE,FILESNAME) VALUES ";
15.$strSQL .="(seq_next_filesid.nextval,'".$_POST["txtName"]."' ";
16.$strSQL .=",'".$_FILES["filUpload"]["type"]."',EMPTY_BLOB()) RETURNING FILESNAME INTO :BLOBDATA";
17. 
18.$objParse = oci_parse($objConnect, $strSQL);
19.oci_bind_by_name($objParse, ':BLOBDATA', $lob, -1, OCI_B_BLOB);
20.$objExecute = oci_execute($objParse, OCI_DEFAULT); 
21.$lob->savefile($_FILES['filUpload']['tmp_name']);
22. 
23.if($objExecute)
24.{
25.oci_commit($objConnect);
26.echo "Copy/Upload Complete<br>";
27.}
28.else
29.{
30.oci_rollback($objConnect);
31.echo "Copy/Upload is not Complete";
32.}
33. 
34.oci_free_descriptor($lob);
35.oci_free_statement($objParse);
36.oci_close($objConnect);
37. 
38.}
39.?>
40.<a href="PageUploadToOracle3.php">View files</a>
41.</body>
42.</html>


PageUploadToOracle3.php
01.<html>
02.<head>
03.<title>ThaiCreate.Com Tutorial</title>
04.<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>
05.<body>
06.<?
07.$objConnect = oci_connect("myuser","mypassword","TCDB");
08.$strSQL = "SELECT * FROM FILES ORDER BY FILESID ASC";
09.$objParse = oci_parse($objConnect, $strSQL);
10.oci_execute ($objParse,OCI_DEFAULT);
11.?>
12.<table width="340" border="1">
13.<tr>
14.<th width="50"> <div align="center">Files ID </div></th>
15.<th width="150"> <div align="center">Picture</div></th>
16.<th width="150"> <div align="center">Name</div></th>
17.<th width="150"> <div align="center">Edit</div></th>
18.</tr>
19.<?
20.while($objResult = oci_fetch_array($objParse,OCI_BOTH))
21.{
22.?>
23.<tr>
24.<td><div align="center"><?=$objResult["FILESID"];?></div></td>
25.<td><center><img src="ViewImage.php?FilesID=<?=$objResult["FILESID"];?>"></center></td>
26.<td><center><?=$objResult["NAME"];?></center></td>
27.<td><center><a href="PageUploadToOracle4.php?FilesID=<?=$objResult["FILESID"];?>">Edit</a></center></td>
28.</tr>
29.<?
30.}
31.?>
32.</table>
33.<?
34.oci_free_statement($objParse);
35.oci_close($objConnect);
36.?>
37.</body>
38.</html>


PageUploadToOracle4.php
01.<html>
02.<head>
03.<title>ThaiCreate.Com Tutorial</title>
04.</head>
05.<body>
06.<?
07.$objConnect = oci_connect("myuser","mypassword","TCDB");
08.$strSQL = "SELECT * FROM FILES WHERE FILESID = '".$_GET["FilesID"]."' ";
09.$objParse = oci_parse ($objConnect, $strSQL);
10.oci_execute ($objParse,OCI_DEFAULT);
11.$objResult = oci_fetch_array($objParse);
12.?>
13.<form name="form1" method="post" action="PageUploadToOracle5.php?FilesID=<?=$_GET["FilesID"];?>" enctype="multipart/form-data">
14.Edit Picture :<br>
15.Name : <input type="text" name="txtName" value="<?=$objResult["NAME"];?>"><br>
16.<img src="ViewImage.php?FilesID=<?=$objResult["FILESID"];?>"><br>
17.Picture : <input type="file" name="filUpload"><br>
18.<input name="btnSubmit" type="submit" value="Submit">
19.</form>
20.<?
21.oci_free_statement($objParse);
22.oci_close($objConnect);
23.?>
24.</body>
25.</html>


PageUploadToOracle5.php
01.<html>
02.<head>
03.<title>ThaiCreate.Com Tutorial</title>
04.</head>
05.<body>
06.<?
07. 
08.//*** Update Record ***//
09.$objConnect = oci_connect("myuser","mypassword","TCDB");
10. 
11.$strSQL = "UPDATE FILES ";
12.$strSQL .=" SET NAME = '".$_POST["txtName"]."' WHERE FILESID = '".$_GET["FilesID"]."' ";
13.$objParse = oci_parse($objConnect, $strSQL);
14.$objExecute = oci_execute($objParse, OCI_DEFAULT); 
15.if($objExecute)
16.{
17.oci_commit($objConnect);
18.}
19.else
20.{
21.oci_rollback($objConnect);
22.echo "Copy/Upload is not Complete";
23.exit();
24.}
25. 
26. 
27.if($_FILES["filUpload"]["name"] != "")
28.{
29. 
30.//*** Update New File ***//
31.$lob = oci_new_descriptor($objConnect, OCI_D_LOB);
32.$strSQL = "UPDATE FILES ";
33.$strSQL .=" SET FilesType = '".$_FILES["filUpload"]["type"]."', ";
34.$strSQL .=" FILESNAME = EMPTY_BLOB() ";
35.$strSQL .=" WHERE FILESID = '".$_GET["FilesID"]."' RETURNING FILESNAME INTO :BLOBDATA ";
36. 
37.$objParse = oci_parse($objConnect, $strSQL);
38.oci_bind_by_name($objParse, ':BLOBDATA', $lob, -1, OCI_B_BLOB);
39.$objExecute = oci_execute($objParse, OCI_DEFAULT); 
40.$lob->savefile($_FILES['filUpload']['tmp_name']);   
41. 
42.if($objExecute)
43.{
44.oci_commit($objConnect);
45.}
46.else
47.{
48.oci_rollback($objConnect);
49.echo "Copy/Upload is not Complete";
50.exit();
51.}
52.oci_free_descriptor($lob);
53. 
54.}
55. 
56.echo "Copy/Upload Complete<br>";
57. 
58. 
59.oci_free_statement($objParse);
60.oci_close($objConnect);
61. 
62.?>
63.<a href="PageUploadToOracle3.php">View files</a>
64.</body>
65.</html>



Screenshot

PHP Upload Oracle BLOB

Form สำหรับการ Upload


PHP Upload Oracle BLOB

Form สำหรับการแสดงข้อมูล

PHP Upload Oracle BLOB

Form สำหรับการแก้ไขข้อมูล

จากตัวอย่างจะเห็นว่าเราไม่สามารถเรียกรูปภาพจาก tag <img> ได้โดยตรง แต่จะต้องมีการสร้างไฟล์ ViewImage.php โดยการส่งค่า ID ไปด้วย ไว้สำหรับอ่าน Binary Data ก่อน แล้วค่อยทำการส่งค่ากลับให้กับ Tag <img>

Code
<img src="ViewImage.php?FilesID=<?=$objResult["FilesID"];?>">

No comments:

Post a Comment