Diễn Đàn Tin Học | Tutorial Room

Tự Học PHP Qua Ví Dụ

Nguyễn Bá Thành - Diễn Đàn Tin Học


Các Vấn Đề Đối Diện Trong Thực Tế
Lưu nội dung file ảnh vào CSDL
Updated: $Id: tute_simple_download_manager.php,v 1.4 2005/11/07 09:45:00 nbthanh Exp $

[Trở về Mục lục phần Các đề đối diện trong thực tế] [Trở về Mục lục chính]

GIỚI THIỆU

Một nhu cầu thường gặp khi phát triển các ứng dụng PHP là lưu nội dung file ảnh vào trong CSDL và sau đó đọc nội dung file ảnh đã lưu trong CSDL và hiển thị ra browser. Việc lưu nội dung file nói chung và file ảnh nói riêng vào CSDL có một số ưu điểm như sau:

Không chỉ giới hạn ở file ảnh, chúng ta có thể lưu bất kỳ file nào vào CSDL. Nhưng để đơn giản, trong bài viết này chúng ta sẽ tìm hiểu về cách lưu file ảnh vào CSDL MySQL. Bạn có thể phát triển thêm chương trình mẫu trong bài viết để lưu các định dạng file khác.

THIẾT KẾ CSDL

Chúng ta sẽ dùng CSDL MySQL trong bài viết này. Chúng ta cần 1 table để lưu nội dung của file ảnh. Table này có ít nhất 2 cột:

Bạn có thể thiết kế thêm một số cột nữa (như ngày tháng file được lưu vào CSDL, tên file...) tuỳ vào yêu cầu cụ thể.

Table của chúng ta sẽ có cấu trúc tương tự như sau:

CREATE TABLE tblImage (
    imgID           int             NOT NULL AUTO_INCREMENT,
    imgData         mediumblob      NOT NULL,
    PRIMARY KEY (imgID)
);

LƯU NỘI DUNG FILE ẢNH VÀO CSDL

Ta xem như đã có file ảnh trên server, đoạn chương trình sau sẽ mở file ảnh thông qua tên file, đọc nội dung của file ảnh vào trong 1 biến và lưu vào CSDL (để đơn giản, các đoạn mã kiểm tra lỗi được lược bỏ).

<?php
//connect vào CSDL MySQL
//host = localhost
//username = root
//password = rỗng
$conn = mysql_connect("localhost", "root", "");
 
//chọn database làm việc
mysql_select_db("test", $conn);
 
//tên file ảnh
$imgFilename = "testimg.jpg";
 
//mở file ảnh để đọc với chế độ đọc binary
$fh = fopen($imgFilename, "rb");
$imgData = fread($fh, filesize($imgFilename));
fclose($fh);
 
//chèn nội dung file ảnh vào table imgData
$sql = "INSERT INTO tblImage (imgData) VALUES('" . mysql_real_escape_string($imgData, $conn) . "')";
mysql_query($sql, $conn);
?>

ĐỌC NỘI DUNG FILE ẢNH TỪ CSDL

Để đọc nội dung của file ảnh từ CSDL, ta cần ID của file ảnh. Đoạn mã sau sẽ minh hoạ điều này:

<?php
//connect vào CSDL MySQL
//host = localhost
//username = root
//password = rỗng
$conn = mysql_connect("localhost", "root", "");
 
//chọn database làm việc
mysql_select_db("test", $conn);
 
//ID của file ảnh
$imgID = 1;
 
//đọc nội dung file ảnh từ table tblImage
$sql = "SELECT * FROM tblImage WHERE imgID=" . $imgID;
$result = mysql_query($sql, $conn);
if ( mysql_num_rows($result) < 1 ) {
	//không tìm thấy image với ID chỉ định
	//thông báo lỗi nếu cần thiết
} else {
	$row = mysql_fetch_assoc($result);
	$imgData = $row['imgData'];
} //end if
?>

Biến $imgData sẽ chứa nội dung của file ảnh. Bước tiếp theo, ta xuất nội dung của file ảnh ra browser. Quá trình xuất nội dung của file ảnh ra browser tương tự như trong ví dụ Một chương trình download manager đơn giản:

<?php
	//...
	$row = mysql_fetch_assoc($result);
	$imgData = $row['imgData'];
	header("Content-type: image/jpeg");
 
	echo $imgData;
	//...
?>

Như bạn cũng đã thấy, lưu file ảnh trong CSDL, đọc dữ liệu ảnh từ CSDL và xuất ra browser thật đơn giản phải không nào? Các bước chính bạn cần lưu ý chỉ là:

CẢI TIẾN CHƯƠNG TRÌNH

Bạn có thể cải tiến thêm chương trình để lưu bất cứ loại file nào chứ không riêng gì file ảnh. Kết hợp với ví dụ trong bài viết Một chương trình download manager đơn giản, bạn có thể làm 1 chương trình upload file và lưu trong CSDL, đồng thời giấu được đường dẫn không cho download file trực tiếp từ server của bạn.

Bạn có thể cải tiến chương trình như sau:

TÀI LIỆU THAM KHẢO


[Trở về Mục lục phần Nâng cao] [Trở về Mục lục chính]

(C) Diendantinhoc.net. All rights reserved.

Nếu bạn phát hiện lỗi, hoặc góp ý về bài viết, xin hãy gởi email về Nguyễn Bá Thành <btnguyen2k@yahoo.com>

Counter
lược xem "Tự học PHP qua ví dụ".