2012-07-19 35 views
5

Tôi hiểu Mongodb có thể lưu trữ hình ảnh theo hai cách.Lưu trữ hình ảnh trong Mongodb phục vụ chúng với Nodejs

  1. trong một tài liệu thường xuyên bằng cách lưu trữ các hình ảnh như nhị phân
  2. qua Gridfs để quản lý hình ảnh lớn hơn.

Để đơn giản và vì những hình ảnh tôi có kế hoạch để máy chủ nhỏ, tôi sẽ đi cho tùy chọn 1.

Để phục vụ hình ảnh vào một trình duyệt Tôi đang sử dụng nodejs.

Câu hỏi của tôi là khó khăn như thế nào? Làm thế nào để bạn chuyển dữ liệu nhị phân sang một hình ảnh thực tế mà trình duyệt sẽ hiểu? Loại mã hóa nào có liên quan?

Bạn có thể chỉ cho tôi các hướng dẫn/ví dụ ở nơi khác trên web không?

Bằng cách này tôi biết điều này có thể không phải là ý tưởng tốt vì lý do hiệu suất, tôi dự định lưu vào bộ nhớ cache hình ảnh sau khi được phân phối. Tôi chỉ muốn tránh toàn bộ hệ thống tập tin.

Trả lời

5

Tôi đặc biệt khuyên bạn không nên phân phối hình ảnh từ MongoDB.

Nó sẽ là tốt hơn để lưu trữ chúng trên một bộ phim tĩnh (S3) và có thể giữ đường dẫn trong MongoDB.


Có thể bạn sẽ sử dụng mã hóa base64 để đưa tệp vào mongodb: http://www.greywyvern.com/code/php/binary2base64/ (hoặc chỉ tiện ích shell base64).

Nếu bạn chỉ sử dụng tài liệu thông thường thì chi phí hiệu suất tương đối thấp (miễn là bộ nhớ đệm là tốt). Nếu bạn đang sử dụng một cơ sở dữ liệu hỗn hợp, nơi bạn có GridFS và tài liệu thường xuyên, bạn sẽ cần rất nhiều RAM trên máy chủ của bạn (s) - các truy vấn GridFS sẽ chạy hoàn toàn khác với các truy vấn tài liệu.

Chuyển đổi hình ảnh có thể làm việc như thế này:

var base64Data = imagefile.replace(/^data:image\/png;base64,/,""), 
var dataBuffer = new Buffer(base64Data, 'base64'); 

// below line won't actually work but it's something along the lines of what you want: 

db.foo.insert({magic: 123, etc... img: dataBuffer.toString()}) 
+0

Điều đó rất hữu ích. Bây giờ tôi có một ý tưởng làm thế nào để lưu trữ các hình ảnh. Bạn có thể vui lòng mở rộng câu trả lời của bạn để bao gồm cách tôi có thể phục vụ hình ảnh không? – jamjam

+0

Tôi có nghĩa là nó sẽ phụ thuộc vào cách bạn truy vấn chúng? 'var c = db.foo.find ({imgname:" something "}; console.log (c.img)' Đó là máy chủ của bạn nên ... Tôi không hoàn toàn chắc chắn cách nói với bạn về việc phân phối nội dung - Tôi cho rằng bạn đang sử dụng nút? – ranman

+0

Truy vấn không phải là vấn đề, tôi có thể lấy dữ liệu Nhưng tôi phải làm gì với dữ liệu nhị phân này để làm cho trình duyệt web hiển thị nó như một hình ảnh bình thường? – jamjam

2

Tất cả bạn cần làm gì để có trình duyệt web của bạn làm cho nội dung là gửi các tiêu đề chính xác và cơ thể phản ứng.

Vì vậy, giả sử bạn đang cố gắng hiển thị hình ảnh PNG, mimetype của bạn sẽ là image/png và sau đó thêm byte tệp hình ảnh vào nội dung phản hồi.

Trình duyệt sau đó sẽ giải thích phản hồi này dưới dạng hình ảnh của loại PNG và hiển thị phản hồi thích hợp

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