2009-10-28 37 views
55

Làm thế nào tôi có thể chèn một hình ảnh trong MySQL và sau đó lấy nó bằng cách sử dụng PHP?Làm cách nào để lưu trữ và truy xuất hình ảnh từ cơ sở dữ liệu MySQL bằng PHP?

Tôi có kinh nghiệm hạn chế ở cả hai khu vực và tôi có thể sử dụng một mã nhỏ để bắt đầu tìm hiểu điều này.

+4

tôi cũng khuyên bạn nên suy nghĩ điều này qua và sau đó chọn lưu trữ hình ảnh trong hệ thống tệp của bạn thay vì DB .. xem tại đây: http://stackoverflow.com/questions/3748/storing-images-in-db -yea-or-nay –

Trả lời

119

Trước tiên, bạn tạo một bảng MySQL để lưu trữ hình ảnh, ví dụ như:

create table testblob (
    image_id  tinyint(3) not null default '0', 
    image_type  varchar(25) not null default '', 
    image   blob  not null, 
    image_size  varchar(25) not null default '', 
    image_ctgy  varchar(25) not null default '', 
    image_name  varchar(50) not null default '' 
); 

Sau đó, bạn có thể viết một hình ảnh vào cơ sở dữ liệu như:

/*** 
* All of the below MySQL_ commands can be easily 
* translated to MySQLi_ with the additions as commented 
***/ 
$imgData = file_get_contents($filename); 
$size = getimagesize($filename); 
mysql_connect("localhost", "$username", "$password"); 
mysql_select_db ("$dbname"); 
// mysqli 
// $link = mysqli_connect("localhost", $username, $password,$dbname); 
$sql = sprintf("INSERT INTO testblob 
    (image_type, image, image_size, image_name) 
    VALUES 
    ('%s', '%s', '%d', '%s')", 
    /*** 
    * For all mysqli_ functions below, the syntax is: 
    * mysqli_whartever($link, $functionContents); 
    ***/ 
    mysql_real_escape_string($size['mime']), 
    mysql_real_escape_string($imgData), 
    $size[3], 
    mysql_real_escape_string($_FILES['userfile']['name']) 
    ); 
mysql_query($sql); 

Bạn có thể hiển thị một hình ảnh từ cơ sở dữ liệu trong một trang web với:

$link = mysql_connect("localhost", "username", "password"); 
mysql_select_db("testblob"); 
$sql = "SELECT image FROM testblob WHERE image_id=0"; 
$result = mysql_query("$sql"); 
header("Content-type: image/jpeg"); 
echo mysql_result($result, 0); 
mysql_close($link); 
+4

Nếu hình ảnh của bạn lớn hơn 65K, bạn sẽ muốn thay đổi kiểu của trường blob. http://stackoverflow.com/questions/3503841/jpa-mysql-blob-returns-data-too-long –

+0

Đối với nhiều hình ảnh khác nhau, tôi đã mã hóa và thoát khỏi các lỗi trình tự với mã ở trên. Tôi đã phải thay thế $ imgData = file_get_contents ($ filename); với $ fp = fopen ($ filepath, 'r'); $ imgData = fread ($ fp, tệp ($ filepath)); $ imgData = addslashes ($ imgData); fclose ($ fp); để làm cho nó hoạt động ổn định. –

+0

Liên kết ở phần đầu của câu trả lời chắc chắn đáng xem xét vì nó chứa chi tiết hơn đáng kể. –

8

Hãy coi chừng việc phân phát hình ảnh từ DB thường là nhiều , nhiều hơn nhiều hơn chậm hơn so với phân phát chúng từ đĩa.

Bạn sẽ bắt đầu một quy trình PHP, mở một kết nối DB, có DB đọc dữ liệu hình ảnh từ cùng một đĩa và RAM cho bộ đệm như hệ thống tệp, chuyển nó qua vài ổ cắm và bộ đệm rồi đẩy ra qua PHP, mà theo mặc định làm cho nó không thể lưu vào bộ nhớ đệm và thêm phí trên của mã hóa HTTP chunked.

Máy chủ web hiện đại OTOH có thể phục vụ hình ảnh chỉ với vài cuộc gọi hạt nhân được tối ưu hóa (tệp ánh xạ bộ nhớ và vùng bộ nhớ được chuyển đến ngăn xếp TCP), sao cho chúng không sao chép bộ nhớ xung quanh và hầu như không có phí.

Đó là sự khác biệt giữa việc có thể phân phát 20 hoặc 2000 hình ảnh song song trên một máy.

Vì vậy, đừng làm điều đó trừ khi bạn hoàn toàn cần tính toàn vẹn giao dịch (và thậm chí có thể thực hiện với siêu dữ liệu hình ảnh trong DB và các thói quen dọn dẹp hệ thống) và biết cách cải thiện việc xử lý HTTP của PHP hình ảnh.

6

tôi cũng khuyên bạn nên suy nghĩ này qua và sau đó lựa chọn để lưu trữ hình ảnh trong hệ thống tập tin của bạn chứ không phải là DB .. thấy ở đây: Storing Images in DB - Yea or Nay?

4

Cá nhân tôi wouldnt lưu trữ các hình ảnh trong cơ sở dữ liệu, Thay vào đó đặt nó trong một thư mục không thể truy cập từ bên ngoài và sử dụng cơ sở dữ liệu để theo dõi vị trí của nó. giữ kích thước cơ sở dữ liệu và bạn chỉ có thể bao gồm nó bằng cách sử dụng PHP. Sẽ không có cách nào mà không cần PHP truy cập vào hình ảnh đó rồi

22

Thay vì lưu trữ hình ảnh trong cơ sở dữ liệu, lưu trữ chúng trong một thư mục trong đĩa và lưu trữ vị trí của chúng trong cơ sở dữ liệu của bạn.

+1

Giả định của bạn. Rất phổ biến của nó bây giờ để có một ứng dụng dựa trên web/trình duyệt mà bạn muốn hoạt động ở chế độ ngoại tuyến, vì vậy bạn cần một số bộ nhớ cache và/hoặc hình ảnh trong cơ sở dữ liệu dựa trên web (WebSQL, PouchDB, Couchbase, Mongo, v.v.). – ekerner

6

Ý kiến ​​của tôi là, Thay vì lưu trữ hình ảnh trực tiếp vào cơ sở dữ liệu, Bạn nên lưu trữ vị trí hình ảnh trong cơ sở dữ liệu. Khi chúng tôi so sánh cả hai tùy chọn, việc lưu trữ hình ảnh trong cơ sở dữ liệu an toàn cho mục đích bảo mật. Nhược điểm là

  1. Nếu cơ sở dữ liệu bị hỏng, không có cách nào để truy lục.

  2. Truy xuất tệp hình ảnh từ db chậm khi so sánh với tùy chọn khác.

Mặt khác, lưu trữ vị trí tệp hình ảnh trong db sẽ có những ưu điểm sau.

  1. Dễ dàng truy xuất.

  2. Nếu có nhiều hình ảnh được lưu trữ, chúng tôi có thể dễ dàng truy xuất thông tin hình ảnh.

Các vấn đề liên quan