• Downloading from our site will require you to have a paid membership. Upgrade to a Premium Membership from 10$ a month today!

    Dont forget read our Rules! Also anyone caught Sharing this content will be banned. By using this site you are agreeing to our rules so read them. Saying I did not know is simply not an excuse! You have been warned.

Hướng dẫn lưu nội dung file ảnh vào CSDL và đọc ra từ CSDL

dgtupltn95

New Member
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:

<ul class='decimal'><li>
[*]Backup/Restore: backup và restore nhiều file nhỏ đôi khi không mấy thuận tiện. Lưu nội dung các file ảnh trong CSDL, bạn chỉ cần backup và restore một file CSDL (thường ở dạng SQL) duy nhất.
[*]Đường dẫn trên website: khi lưu file ảnh trên đĩa, nếu cấu trúc thư mục bị thay đổi, bạn có thể phải cập nhật lại đường dẫn ở nhiều chỗ trên website. File ảnh trên đĩa có thể bị xoá mất, hoặc khi bạn backup/restore bị thiếu...Khi lưu file ảnh trong CSDL, bạn có thể giảm thiểu được các rủi ro này.
[*]Cấu hình chung của một số host không cho phép bạn lưu file sau khi được upload lên server (qua form upload) trong thư mục (nếu như bạn không cấp quyền write cho everyone, và như vậy thì khá nguy hiểm cho website của bạn). Lưu file trong CSDL là giải pháp khá thích hợp trong hoàn cảnh này.
</li></ul>
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:

<ul class='decimal'><li>
[*]Cột lưu nhận dạng (ID) của file ảnh, để đơn giản ta sẽ sử dụng kiểu dữ liệu AUTO_INCREMENT để làm ID cho các file ảnh lưu trong CSDL. Ta đặt tên cho cột này là imgID.
[*]Cột lưu nội dung của file ảnh. Nội dung của file ảnh cũng là 1 chuỗi, nhưng dữ liệu nhị phân. Chúng ta sẽ sử dụng kiểu dữ liệu mediumblob để lưu trữ nội dung của file ảnh (kiểu dữ liệu blob cũng là chuỗi nhị phân, nhưng độ dài tối đa chỉ 65Kb, sẽ không đủ nếu như ta muốn lưu các file ảnh lớn). Ta đặt tên cho cột này là imgData.
</li></ul>
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)
);[/PHP]

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:
<?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:
<?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ụ 301 Moved Permanently

PHP:
<?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à: 

<ul class='decimal'><li>
[*]Đọc nội dung file vào 1 biến, bạn nhớ phải mở file với chế độ đọc binary. 
[*]Xử lý các ký tự đặc biệt trước khi lưu vào database (sử dụng hàm mysql_real_escape_string). 
[*]Trước khi xuất nội dung file ra browser, bạn nhớ dùng hàm header để báo cho browser biết kiểu file mà chương trình của bạn chuẩn bị trả về (tham khảo thêm bài viết http://sinhvienit.net/@forum/php-perl-jsp/8795-tim-kieu-ham-header-trong-php-va-cach-viet-mot-code-download-don-gian-de-dau-link-den-file.html). 
</li></ul>
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 http://sinhvienit.net/@forum/php-perl-jsp/8795-tim-kieu-ham-header-trong-php-va-cach-viet-mot-code-download-don-gian-de-dau-link-den-file.html, 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: 

<ul class='decimal'><li>
[*]Đổi tên table tblImage thành tên khác, ví dụ như tblUpload để chứa các file bất kỳ được upload chứ không riêng gì file ảnh. 
[*]Lưu tên file: tạo thêm 1 cột trong table tblUpload để lưu tên file gốc ban đầu. 
[*]Lưu kích thước file tạo thêm 1 cột trong table tblUpload để lưu kích thước của file. 
[*]v.v... 
</li></ul>
TÀI LIỆU THAM KHẢO
 
<ul class='decimal'><li>
[*]PHP Manual: http://www.php.net/manual/en/index.php
[LIST]
[*]Các hàm thao tác với CSDL MySQL: http://www.php.net/manual/en/ref.mysql.php 
[*]Các hàm thao tác với file: http://www.php.net/manual/en/ref.filesystem.php 
</li></ul>
  
[*]Google: từ khoá MIME types list
<ul class='decimal'><li>
[*]Các kiểu dữ liệu tương ứng với các kiểu file thông dụng: http://www.webmaster-toolkit.com/mime-types.shtml 
</li></ul>
DDTH
 

Facebook Comments

Similar threads
Thread starter Title Forum Replies Date
F FStorage – Giải Pháp Lưu Trữ Dữ Liệu Tập Trung, An Toàn Cho Doanh Nghiệp Tin tức CNTT 0
F Giải pháp lưu trữ/backup dữ liệu đảm bảo từ FPT Telecom - Hãy chia sẻ nhu cầu của bạn - Chúng tôi sẽ đưa ra giải pháp Tin tức CNTT 0
F Bạn có biết về điểm thưởng Fshare? Những chính sách khách hàng sở hữu điểm thưởng cần lưu ý! Tin tức CNTT 0
F Bạn đã thử dùng gói lưu trữ Storage của Fshare chưa? Tin tức CNTT 0
F ƯU ĐÃI LÊN ĐẾN 50GB LƯU TRỮ CHO HỌC SINH SINH VIÊN! Tin tức CNTT 0
F GIẢI PHÁP LƯU TRỮ 2023: FSHARE STORAGE Thông tin khuyến mại Fshare 0
katy Android MobiFone triển khai “Gói combo mới - Lưu trữ cả thế giới” Điện thoại di động 15
F FSTORAGE – Giải pháp lưu trữ cho các doanh nghiệp mô hình SMEs Tin tức, sự kiện thường ngày 0
Thichquangboom Tin Vui Fshare Tăng Số Ngày Lưu Trữ Dữ Liệu Lâu Hơn Tin tức, sự kiện thường ngày 0
tunglamed MobiFone ra mắt mobiCloud: Lưu trữ thả ga - Trao quà liền tay Điện thoại di động 6
cuongpro9x Air explorer v4 - Công cụ quản lý lưu trữ đám mây cực tốt Phần mềm 0
Thichquangboom Fshare sale tưng bừng: Fshare thả ga lưu trữ, thanh toán tiết kiệm cùng ví Moca Tin tức CNTT 0
B Những lưu ý khi vùng kín bị giản rộng và cách giải quyết tối ưu nhất Thảo luận chung 0
Thichquangboom Fshare ra mắt gói storage – lưu trữ siêu khủng. Thông tin khuyến mại Fshare 1
Thichquangboom [Fshare] - GÓI VIP SIÊU RẺ MỚI TẶNG 150GB LƯU TRỮ BẢO ĐẢM Thông tin khuyến mại Fshare 0
Admin Phần mềm PC key bản quyền phần mềm iBackupBot - Sao lưu đồng bộ dữ liệu giữa iPhone, iPad Phần mềm 325
phuocnguyen One Driver cung cấp hosting lưu trữ dữ liệu online free Hosting & Domain Free 0
N Tiki.vn giảm giá sốc vào ngày cuối của “Tuần Lễ Lưu Trữ - Lần 2” Tin tức CNTT 0
N Toshiba Canvio DTP210 1TB, lựa chọn hấp dẫn cho lưu trữ di động truyền thống Tin tức CNTT 1
Thichquangboom Fshare thưởng khủng đến 1TB lưu trữ cho người dùng Thông tin khuyến mại Fshare 0
thuanmobile1 Album [Sub + Lyrics] Khát Vọng Thượng Lưu - Nguyễn Đình Vũ Âm nhạc 0
H Share Share Code sao lưu, Phục Hồi CSDL Cực Cool chỉ 1 file duy nhất All Shared Scripts 0
Dean.Winchester Thủ thuật Công cụ miễn phí giúp sao lưu an toàn dữ liệu cho máy tính Thủ thuật máy tính 0
E [Giao lưu] Chào mọi người, em là thành viên mới! Thảo luận chung 12
Admin Hướng dẫn sao lưu và phục hồi bản quyền win 10 và office 2013 nhanh chóng Phần mềm 2
H [Hốt] Game Super Mario 4 Game Phiêu lưu Hay Nhất 2014, Đồ Hoạ Cực Đỉnh ,Cùng Test Thôi ACE Crack, hack, mod, ghép game, ứng dụng 1
Admin Hướng dẫn cách biết nơi lưu tập tin mặc định sau khi detach database SQL 2008 Sử dụng, chia sẻ, hỏi đáp 1
Admin Hướng dẫn sao lưu và khôi phục dữ liệu bằng Percona XtraBackup đơn giản VPS & Dedicated Server 0
Admin Acronis True Image Home 2014 17 Build 5560 Final - Sao lưu và phục hồi dữ liệu hiệu quả Phần mềm 1
A Hosting Chất Lượng Giá Rẻ-Giải pháp lưu trữ an toàn, tin cậy Hosting / Domain 20
Admin Những lưu ý khi dùng đại từ quan hệ Sách, truyện, tài liệu 0
Admin Download DriverMax 7.25 Full Free - Phần mềm giúp sao lưu Driver cho máy tính Phần mềm 0
Admin Facebook đang thử nghiệm tính năng lưu đường link lại để đọc sau Tin tức CNTT 4
Admin Gmail cho lưu tập tin đính kèm vào Drive, xem tập tin Tin tức CNTT 0
Admin SkyDrive cho iOS cập nhật bản mới, hỗ trợ sao lưu tự động ảnh và video, giao diện phong cách iOS 7 Android, iOS 0
Admin Google cho phép người dùng Gmail trực tiếp lưu tập tin đính kèm lên Google Drive Tin tức CNTT 1
Admin Share mã nguồn game phiêu lưu, mạo hiểm HTML5 HTML & CSS 0
Admin Miễn phí bản quyền O&O DiskImage 6.8 - Phần mềm sao lưu và khôi phục hệ thống Phần mềm 0
Admin Chrome cho Mac sẽ yêu cầu mật khẩu chính để xem các mật khẩu đã lưu Tin tức CNTT 0
Admin Backup and restore database with SSH - Sao lưu và khôi phục CSDL với SSH VPS & Dedicated Server 1
Admin Hướng dẫn khắc phục lỗi wb7 is not a valid khi sao lưu data PHP 0
D Share Sao lưu dữ liệu bằng PHP -Backup MySQL Database Using PHP All Shared Scripts 0
djdungcuty Thủ thuật Ngăn Người Khác Xem Trộm Password Lưu Trên Trình Duyệt Sử dụng, chia sẻ, hỏi đáp 0
Admin Share code lưu chỉ mục cho uc HTML & CSS 0
boy94 Share site lưu trữ code cho ae wapmaster Thảo luận wap việt 3
VMS-Mobifone Lưu ý về cước data khi sử dụng dịch vụ Zoota của mobifone Thông tin các mạng di động 0
Admin [Kleii] The Adventures of Tintin (2011) BRrip 720p_Cuộc Phiêu Lưu Của TinTin (2011) (Kèm Phụ Đề) Phim 0
S Microsoft tặng thêm 3 GB lưu trữ SkyDrive cho đối tượng sinh viên Tin tức CNTT 0
Admin Microsoft tặng thêm 3GB dung lượng lưu trữ trên Skydrive cho sinh viên Tin tức CNTT 0
Admin Flickr được làm mới giao diện, miễn phí 1TB dung lượng lưu trữ Tin tức CNTT 1

Similar threads

New posts New threads New resources

Back
Top