พบกับบทความเกี่ยวกับคอมพิวเตอร์และ programming ได้ที่ http://articles.modoeye.com
PHP development / การแสดงไฟล์รูปภาพจากฐานข้อมูล
guest
guest
Mon 7 Nov 2005 17:38:31

สวัสดีครับทั่นเว็บมาสเตอร์  คือว่าผมจะทำการดึงไฟล์รูปภาพจาก ฐานข้อมูลน่ะครับ...เป็น mysql แต่พอดึงมาแล้ว..มันไม่เป็นภาพน่ะครับ...เป็นตัวอักษรอะไรไม่รู้เต็มไปหมดเลย...

โค๊ดในการ upload นะครับ

$filename =$HTTP_POST_FILES['files']['name'];
$filetempname =$HTTP_POST_FILES['files']['tmp_name'];
$filesize =$HTTP_POST_FILES['files']['size'];

$fp = fopen($filetempname,"r");
$data = fread($fp,filesize($filetempname));
fclose($fp);
$data = addslashes($data);
$sql="insert into doctor (Doctor_Fname,Doctor_Lname,Dep_ID,Doctor_Detail,Picture) values('$doctorfname', '$doctorlname','$dep','$detail','$data')";
$result=mysql_query($sql);

ส่วนโค๊ดในการ ดึงรูปมาโชว์คือ

<?

require("..\web\config.php");
$sql="select * from doctor where doctor_id=1";
$result=mysql_query($sql);
$images = mysql_fetch_array($result);
echo $images['Picture'];

?>

ช่วยดูให้ทีนะครับ....

Administrator
Mon 7 Nov 2005 18:26:54
การ upload เข้า mysql นั้น เป็นการเขียนข้อมูลโดยการเขียนเป็นข้อมูลลักษณะ ASCII text (เหมือนตัวอักษรทั่วไปครับ) ดังนั้นการเขียนข้อมูลลงไปนั้นอาจจะมีอักขระที่เป็น escape charactors ของ mysql อยู่ด้วยครับ ดังนั้น host ส่วนใหญ่จะเปิด magic_quote_gpc directive ไว้อยู่แล้วครับ เมื่อมีการรับข้อมูลจากไฟล์ที่ถูกอ่านเข้ามาจะมีการ replace เหมือนกับการใช้ addslashes() ของ PHP โดยการทำงานคร่าวๆก็เป็นการใส่เครื่องหมาย "\" ไว้หน้า escape charactors ทั้งหมดครับ

ดังนั้นข้อมูลที่ถูกเขียนลงใน database นั้นจะมีการใส่ "\" ไว้หน้า escape charactors ทั้งหมดครับ ดังนั้นการแสดงผลจึงต้องมีการนำเครื่องหมายเหล่านี้ออกด้วยครับถึงจะได้ข้อมูลที่ถูกต้องครับด้วย stripslashes()

** ที่สำคัญต้องมีการส่ง header ไปบอกด้วยครับว่าเป็นไฟล์ชนิดอะไร เช่น header("image/jpeg") ด้วยครับ
guest
guest
Tue 8 Nov 2005 09:20:23

ก็ยังไม่ได้อ่ะครับ...ดูโค๊ดนะครับ(การแสดงรูป)

<html>
<head>
<title>test download picture</title>
<meta http-equiv="Content-Type" content="text/html; charset=tis-620">
</head>
<body>
<?
require("..\web\config.php");
$sql="select * from doctor where doctor_id=17";
$result=mysql_query($sql);
$images = mysql_fetch_array($result);
stripslashes();
header("Content - type : image/jpeg");
echo $images['Picture'];
?>
</body>
</html>

Administrator
Tue 8 Nov 2005 13:59:27
การแสดงรูปจากฐานข้อมูลจะต้องไม่มีส่วนของ html เลยครับ มีเพียงโค๊ดเท่านี้ครับ
<?
$link = @mysql_connect("localhost", "uid", "pass");
@mysql_select_db("db_name", $link);
$res = @mysql_query("SELECT * FROM doctor WHERE doctor_id=17", $link);
$images = @mysql_fetch_array($res, MYSQL_ASSOC);
@mysql_free_result($res);
@mysql_close($link);

header("Content-type: image/jpeg");
echo stripslashes($image["picture"]);
?>

ในการใช้งานจริงแล้วในฐานข้อมูลที่เก็บรูปภาพนั้นควรจะให้มีการอ่านขนิดของไฟล์และเก็บไว้ในฐานข้อมูลด้วยครับ เพื่อที่จะได้แสดงผลได้อย่างถูกต้อง เช่น image/jpeg, image/gif, image/png หรืออื่นๆอีกมากครับ
guest
guest
Tue 8 Nov 2005 14:41:25

ขอบคุณครับ...และแล้วก็ถึงทางสว่างเสียที....จักเป็นพระคุณอย่างสูง

guest
guest
Tue 8 Nov 2005 15:46:55
อีกครั้งนึงครับ...ทำอย่างที่ทั่นบอกแล้ว ภาพก็โชว์แล้ว  แต่....โชว์มาไม่เต็มรูปน่ะครับ โชว์ส่วนบนนิดเดียวแล้วที่เหลือออกแนว เละ ๆ น่ะครับ...ไม่ทราบว่าเป็นเพราะอะไร ผมเก็บเป็น แบบ longblob ครับ.. ภาพ แค่ 20 กว่า K เอง
Administrator
Tue 8 Nov 2005 16:01:46
ถ้าเก็บเป็น longblob ก็ไม่น่าจะเป็นที่ขนาดของ field ครับ (longblob ~= 4GB) น่าจะเป็นที่ตอน upload ข้อมูลเข้ามาใน database มากกว่าครับ ต้องรบกวนให้เช็คข้อมูลตรงนี้ด้วยครับว่าข้อมูลที่ถูกอ่านเข้ามาครบถ้วนหรือไม่ครับ
guest
guest
Tue 8 Nov 2005 16:48:40

โค๊ด upload อยู่ข้างบนสุดเลยครับ...ตามนั้นเลย  ส่วนการอับโหลดครบหรือเปล่านั้น ผมลองไปดูใน เทเบิล ปรากฎว่า ขนาด ที่เก็บเท่ากับรูปเลยครับ...เป็น [BLOB-15.7 กิโลไบท์] ครับ

Administrator
Tue 8 Nov 2005 18:01:48
จากโค็ดข้างบนนี้ไม่น่าจะมีปัญหานะครับ ถ้าเป็นไปได้ถ้าสามารถใช้ mysqlcc ลองเปิดดูจะสามารถดูความถูกต้องของข้อมูลได้ครับ ซึ่งขนาดของข้อมูลเท่ากันแน่นอนครับเพราะว่าเราอ่านออกมาโดยระบุขนาดของไฟล์จึงได้ขนาดข้อมูลเท่ากับขนาดของไฟล์แต่ข้อมูลอาจจะไม่ครบได้ครับ
ลองดาวน์โหลด mysqlcc มาลองดูครับ
guest
guest
Tue 8 Nov 2005 18:56:38

ขอโทษนะครับ..คือว่าผมดาวน์โหลดมาแล้ว แต่ผมใช้ไม่เป็นน่ะครับ...ไม่ทราบว่าพอจะแนะนำได้ไหมครับ...จักเป็นพระคุณอย่างสูง....

Administrator
Tue 8 Nov 2005 19:52:57
ขอโทษด้วยครับเพิ่งเข้าไปดูเห็นว่ามีแต่ mysql administrator ซึ่งไม่สามารถ view ข้อมูลได้ครับ ดาวน์โหลดได้ที่นี่ครับ
การใช้งาน
Create connection (Ctrl+N) ใส่ชื่อ connection, host name, user name, password ตามค่าที่ใช้ในการติดต่อ mysql ครับ

เสร็จแล้วทำการติดต่อเข้าไปยัง mysql server โดยดับเบิ้ลคลิ๊กที่ connection แล้วเข้าไปที่ database ที่ต้องการ เลือกที่ table ที่ต้องการ แล้วสามารถเลือกดูข้อมูลได้ทุก field และทุก record เลยครับ ซึ่งถ้าเป็นข้อมูล blob นั้นจะแสดงเป็นรูปขึ้นมาเลยครับ ซึ่งลองดูว่ารูปใน database นั้นถูกต้องหรือไม่ครับ
guest
guest
Wed 9 Nov 2005 08:19:41
สวัสดีครับทั่นเว็บมาสเตอร์ ผมลองใช้ Mysql Control Center ดูแล้วปรากฏว่า รูปที่เก็บไว้ สมบูรณ์ทุกอย่างครับ....คราวนี้เลยไม่รู้ว่าเป็นที่อะไร...จะเกี่ยวกันไหมที่ผมใช้ กับ เวอร์ชั่น ของ appserv ครับ....ผมใช้เวอร์ชั่น 2.3.0 ครับ..
Administrator
Wed 9 Nov 2005 12:04:45
ไม่น่าจะเกี่ยวกับ AppServ นะครับ โดยส่วนตัวแล้วคิดว่าน่าจะมาจากที่ไม่สามารถส่ง header Content-length มาด้วยน่ะครับ

ถ้าเป็นไปได้รบกวนท่าน guest สร้าง table เพื่อเก็บข้อมูลรูปภาพโดยโครงสร้างดังนี้ครับ
create table images (
image_id tinyint(3) not null default '0',
image_type varchar(25) not null default '',
image_blob blob not null,
image_size varchar(25) not null default ''
);
โดยการอัพโหลดก็ทำการอ่านค่าแล้วเก็บข้อมูลเข้า database เพิ่มเท่านั้นครับ

ส่วนในการแสดงผลก็เป็น
header("Content-type:".$row["imagetype"]);
้header("Content-length:".$row["image_size"]);
echo stripslashes($row["image_blob"]);

เพื่อความถูกต้องของข้อมูลครับ
guest
guest
Wed 9 Nov 2005 13:55:58

ครับผม...จะลองแก้ไขตรงส่วนนี้ดู...แล้วได้ผลเป็นยังงัย...จะแจ้งให้ทราบนะครับเพื่อเป็นความรู้ให้กับท่านอื่น..ขอบคุณทั่นเว็บมาสเตอร์มากครับ

guest
guest
Wed 9 Nov 2005 15:25:49

ปรากฎว่า รูปไม่ออกครับ   ตรวจดูใน Mysql Control Center ข้อมูลก็มาปกติ แต่ ทำไม Type เป็น "image/pjpeg" ครับ พอเวลาดึงรูปมาดูก็ทำแบบที่ทั่นเว็บมาสเตอร์บอกเป๊ะเลย แต่รูปไม่โชว์ ครับ.....

Administrator
Wed 9 Nov 2005 20:08:34
ขอโทษทีครับตอนแสดงผลไม่ต้อง stripslashes() แล้วเพราะว่าการแสดงผลจะได้แสดงอักขระพิเศษได้อย่างถูกต้องครับ ก็จะเหลือโค็ด
header("Content-type:".$row["imagetype"]);
้header("Content-length:".$row["image_size"]);
echo $row["image_blob"];
guest
guest
Thu 10 Nov 2005 08:53:29

ก็ยังไม่ออกอยู่ดี...โฮะ โฮะ จนปัญญาแล้ว...ผม....ตาย

ไม่ทราบว่าเกี่ยวกันไหม ผมใช้ดรีมเขียน แล้วรัน โดยใช้ Appserv

http://localhost/Web/test1.php

โครงสร้างของฐานข้อมูลก็

Pic_ID tinyint(3)

Pic_Name varchar(45)

Pic_Type varvhar(25)

Pic_Data blob

Pic_Size varchar(25)

แล้วไฟล์ test1.php ก็มีโค๊ดดังนี้

<?
$link = @mysql_connect("localhost", "root", "");
@mysql_select_db("sirivej", $link);
$res = @mysql_query("SELECT * FROM picture WHERE Pic_ID=2", $link);
$images = @mysql_fetch_array($res, MYSQL_ASSOC);
@mysql_free_result($res);
@mysql_close($link);

header("Content-type:".$row["Pic_Type"]);
header("Content-length:".$row["Pic_Size"]);
echo $row["Pic_Data"];
?>

แต่ภาพไม่ยอมออกมา....

Administrator
Thu 10 Nov 2005 14:55:13
ขอโทษด้วยครับตอนนี้เช็คโค๊ดแล้ว ส่วนของ upload นะครับ
<?
$link = @mysql_connect("localhost", "root", "");
    mysql_select_db("dbname" ,$link);
    $data = fread(fopen($_FILES["userfile"]["tmp_name"], "rb"), filesize($_FILES["userfile"]["tmp_name"]));
    $res = mysql_query("INSERT INTO modoeye_images(image_blob, image_type, image_size) VALUES('".$data."', '".$_FILES["userfile"]["type"]."', ".filesize($_FILES["userfile"]["tmp_name"]).")", $link);
    mysql_close($link);
?>


ส่วนของการ download ครับ
<?
$link = mysql_connect("localhost", "root", "");
    mysql_select_db("dbname", $link);
    $res = mysql_query("SELECT * FROM modoeye_images WHERE image_id=".(int)$_GET["id"], $link);
    $row = mysql_fetch_array($res, MYSQL_ASSOC);
    mysql_free_result($res);
    mysql_close($link);
   
    header("Content-type: ".$row["image_type"]);
    header("Content-length: ".$row["image_size"]);
    echo stripslashes($row["image_blob"]);
?>

ทั้งหมดนี้ผมทดลองใน php ที่เปิด magic_quote_gpc นะครับ จะเห็นว่าตอน upload ผมไม่จำเป็นต้องใส่ addslashes() แต่ตอนแสดงผลผมต้งอใส่ stripslashes() เพิ่ม เพราะว่า system จะทำการ add ส่วน slash ส่วนเกิดเข้ามาครับ ลองนำไปใช้ดูนะครับ
Tucky
Tucky
Fri 19 Sep 2008 14:56:10

ยังมะได้เหมือนกันอะค่ะ ไม่รู้ทำไรผิด ภาพที่ออกมามันเป็นภาษาต่างดาวอะ

โค๊ดก็เป็นดังนี้อะค่ะ

          <?
             $hostname = "localhost";
             $user = "root";
             $password = "many1616";
             $dbname = "tooktun";
             $tblname = "Dolls";
             mysql_connect($hostname, $user, $password) or die("ติดต่อฐานข้อมูลไม่ได้");
             mysql_select_db($dbname) or die("เลือกฐานข้อมูลไม่ได้");  

               $link = @mysql_connect($hostname,$user, $password);
               @mysql_select_db($dbname, $link);
               $res = @mysql_query("SELECT * FROM Dolls  WHERE ID = 'D001')", $link);
               $images = @mysql_fetch_array($res, MYSQL_ASSOC);

             header("Content-type: image/gif");
             echo stripslashes($images["DPic"]);

               @mysql_free_result($res);
               @mysql_close($link);
          ?>

และอีกอย่างตรง header มันฟ้องว่าหยั่งงี้ด้วยอะคะ

Warning: Cannot modify header information - headers already sent by (output started at C:\AppServ\www\tooktun\Webboard.php:144) in C:\AppServ\www\tooktun\Webboard.php on line 161

ทำไงดีคะเนี่ย แงๆ


webmaster
webmaster
Sun 21 Sep 2008 02:35:02
แปลว่ามีการส่งข้อมูลมายัง browser ก่อนหน้านั้นซึ่งไม่สามารถส่ง header ได้อีกครับ
Reply
Name:
E-mail:
Home | Services | Forum | Classified | Directories | Support | Contact
ATOM feed RSS 0.9 feed RSS 1.0 feed RSS 2.0 feed
Copyright © 2005 - 2007 Modoeye.com, All Rights Reserved.
Disclaimer | Privacy policy | Term of Use | Term of Services
Valid XHTML Valid CSS! PHP: Hypertext Preprocessor MySQL database Apache Powered! FreeBSD Power to serve
Modoeye Sitemap Client login