2009-11-07 44 views

Trả lời

0

Dưới đây là example lưu trữ hình ảnh ở dạng nhị phân trên cơ sở dữ liệu MySQL. Tôi không chắc liệu có lợi thế hay không. Tôi sẽ để nó cho người khác bình luận.

Một cách khác bạn có thể làm là lưu trữ vị trí của hình ảnh trong một cột và truy vấn vị trí đó để tham chiếu.

+1

Vâng, tôi khuyên rằng, trừ khi có lý do nào đó hình ảnh cần được bảo mật. Bằng cách làm theo cách này, hình ảnh đầu tiên cần phải được trích xuất từ ​​cơ sở dữ liệu và sau đó nhị phân được xử lý. Điều này sẽ làm tăng tải trên máy chủ PHP cũng như máy chủ MySQL. Lời khuyên thứ hai của bạn là tốt hơn; lưu trữ hình ảnh trong một thư mục hình ảnh người dùng, có thể đặt tên chúng là uniqid() và sau đó tham chiếu URL tương đối đó trong db. – BraedenP

2

Nếu tôi là bạn, tôi sẽ lưu hình ảnh vào thư mục trang web của bạn và sau đó lưu liên kết tới hình ảnh trong MySQL, nếu bạn thực sự muốn lưu nó vào cơ sở dữ liệu, tôi sẽ đọc nó thành chuỗi và sau đó base64_encode() nó và sau đó lưu nó trong cơ sở dữ liệu.

Có rất nhiều vấn đề bạn phải đối mặt bằng cách lưu trữ chúng trong cơ sở dữ liệu, bạn sẽ phải tạo tập lệnh để phản hồi lại, và tải máy chủ và cơ sở dữ liệu sẽ tăng lên rất nhiều. Nếu tôi là bạn, tôi chỉ lưu trữ tài liệu tham khảo.

1

Tôi khuyên bạn nên có bảng nơi bạn lưu trữ dữ liệu người dùng như tên người dùng, tên. Trong bảng đó, tạo một trường được gọi là "hình đại diện", trong đó bạn có thể lưu trữ tham chiếu tệp.

Giả sử avatar người dùng của bạn được lưu trữ trong: htdocs/images/avatars/ Và apikot người dùng có hình đại diện "avatar.jpg" được lưu trữ lần nữa là người dùng trong cơ sở dữ liệu, sau đó bạn có thể biên dịch url sau đây khi tạo thẻ hình ảnh : "/htdocs/images/avatars/avatar.jpg".

0

Tạo một trường loại BLOB, và chèn kết quả của file_get_contents ($ ImageFile)

16

"Best" phụ thuộc vào những gì mục tiêu của bạn là.

Hai cách chính để lưu trữ hình ảnh do người dùng tải lên là đưa nội dung nhị phân vào cơ sở dữ liệu dưới dạng BLOB hoặc lưu hình ảnh vào ổ đĩa ở đâu đó và đặt mục nhập vào cơ sở dữ liệu.

Đặt hình ảnh trong cơ sở dữ liệu có lợi thế là không yêu cầu bất kỳ loại quyền hệ thống tệp nào trên máy chủ web và loại bỏ bất kỳ loại sự cố đồng bộ hóa nào nếu bạn đang phục vụ trang web của nhiều máy chủ web. Tuy nhiên, theo thời gian nó làm cho cơ sở dữ liệu của bạn rất lớn, và nếu bạn không thiết kế bảng của bạn một cách chính xác, nó hoàn toàn có thể giết hiệu suất và khả năng mở rộng của bạn.

Lưu trữ hình ảnh dưới dạng tệp trên hệ thống tệp có lợi thế bổ sung là việc khôi phục cực kỳ nhanh chóng và hiệu quả, vì máy chủ web rất giỏi trong việc phân phát tệp tĩnh.

Edited để thêm

Nếu bạn quyết định để lưu trữ nội dung tập tin trong cơ sở dữ liệu, hoàn toàn không đặt nó trong một bảng mà cần phải được truy cập một cách nhanh chóng. Ví dụ: nếu bạn có bảng "người dùng" được tìm kiếm trên hầu hết các lần truy cập trang, thì bảng đó là không phải là nơi để đặt nội dung tệp của bạn. Thay vào đó, hãy tạo một bảng "hình ảnh" hoặc "tệp" riêng biệt chứa tệp và thông tin meta có liên quan.

Đặt nhiều byte mỗi hàng vào một bảng làm cho bảng đó hoạt động rất chậm. Bạn không muốn những thứ như vậy trong các bảng mà thấy sử dụng nhiều.

+0

Nếu bạn định sử dụng cơ sở dữ liệu, đó là một ý tưởng rất hay. Và để làm sáng tải trên bảng hình ảnh, việc sử dụng memcache để lưu trữ hình ảnh cũng sẽ giúp ích cho bạn. – BraedenP

+0

Hệ quả: Nếu nội dung tệp của bạn cần được truy cập nhanh, không lưu trữ nó trong cơ sở dữ liệu. –

13

hình ảnh thực sự cần được lưu trữ trên hệ thống tập tin cho một vài lý do:

  • Ủy quyền và If-Modified-Since yêu cầu web: Apache có thể xử lý If-Modified-Since HTTP header cho bạn và trả lại câu trả lời 304 và đó là về hiệu suất tốt nhất mà bạn có thể nhận được. Các proxy và proxy ngược được đăng tại các ISP sẽ cố gắng tận dụng điều này.

  • Quét vi-rút: nếu bạn cho phép bất kỳ tệp tải lên nào, jerks sẽ thử và tải lên nội dung đáng sợ để xem liệu chúng có thể phá trang web của bạn hay không. Việc chạy ClamAV hoặc các nội dung tương tự với video tải lên của người dùng của bạn không hợp lý để xem có vấn đề gì không. Bạn sẽ không muốn kết nối cơ sở dữ liệu của mình nếu bạn muốn quét các bản ghi cho phần mềm độc hại.

  • Giản đồ giản đồ: Nếu bạn cho phép tải lên tệp, bạn cũng sẽ cần phải thêm dữ liệu meta về loại MIME, kích thước tệp, chiều cao và chiều rộng. Nếu bản thân tệp không khớp với loại MIME trong bảng, thì bạn cần mã một lựa chọn từ bảng và truyền nó vào /usr/bin/file. Nó có thể đơn giản hơn nhiều để shell_exec("/usr/bin/file /path/to/mumble").

  • Đặt ngón tay cái: Tải lên hình ảnh của người dùng có thể cần phải được đóng đinh ngón tay cái và điều này thường dễ dàng thực hiện không đồng bộ hơn với yêu cầu web thực tế. Nó thực sự không vui khi một số người dùng có ý nghĩa cố gắng tải lên một tệp photoshop 150MB do họ nhiếp ảnh gia chuyên nghiệp cung cấp cho họ, và trường hợp apache của bạn đi OOM khi cố gắng tải thư viện ImageMagick trong không gian bộ nhớ của nhân viên web. Điều này thực sự không quy mô cho công nhân apache. Tạo một hàng đợi công việc/cron job bên ngoài Apache để xử lý công việc này.

  • Bảng tham nhũng: Wow, bạn không thực sự muốn làm tê liệt tất cả avatar người dùng nếu file index MySQL của bạn bị borked và bạn cần phải làm một sửa chữa bảng ẩn trên bảng đó.

  • Sao lưu và khôi phục: Bạn không thực sự muốn khóa bảng lớn với mysqldump. Sử dụng rsync sẽ giúp bạn tiết kiệm rất nhiều thời gian và cung cấp cho bạn sự linh hoạt hơn nhiều. Các bảng thường được khôi phục toàn bộ bảng một thời gian - các bảng thường không được sao lưu thành các phần nhỏ hơn.

3

tạo một thư mục mới trên máy chủ của bạn cho mỗi người dùng có id người dùng làm tên thư mục và lưu hình ảnh của người dùng bên trong. bất cứ khi nào bạn muốn hiển thị hình ảnh của người dùng:

<img src="<path>/users_images/<user_id>/thumb.gif" /> 
Các vấn đề liên quan