Lưu trữ hình ảnh trong cơ sở dữ liệu MongoDB


174

Làm cách nào tôi có thể lưu trữ hình ảnh trong cơ sở dữ liệu MongoDB thay vì chỉ văn bản? Tôi có thể tạo một mảng hình ảnh trong cơ sở dữ liệu MongoDB không? Nó sẽ có thể làm điều tương tự cho video?


1
Câu trả lời ngắn gọn là: Có, bạn có thể lưu trữ hình ảnh (nhỏ) nếu bạn mã hóa chúng chính xác với base64, xem stackoverflow.com/questions/11442356 Tôi cũng tìm thấy menge.io/2015/03/24/storing-small-images-in- mongodb một điểm khởi đầu rất tốt.
B - rian

Câu trả lời:


108

Vui lòng xem tài liệu GridFS để biết chi tiết về việc lưu trữ dữ liệu nhị phân đó.

Hỗ trợ cho ngôn ngữ cụ thể của bạn nên được liên kết ở dưới cùng của màn hình.


40
GridFS dành cho tài liệu> 16MB. Không phải tất cả dữ liệu nhị phân là lớn này. Ngoài việc có thể vượt qua giới hạn đó, còn có lợi ích nào khác khi sử dụng GridFS thay vì chỉ loại BinData không?
Brandon Fitzpatrick

3
Video sẽ có xu hướng> 16MB nên câu trả lời này có lẽ hợp lý. Có lẽ nên đề cập đến điều này mặc dù.
Chanoch

1
bất kỳ giải pháp nào khác, thay vì sử dụng GridFS?
Abhishek Mani

1
@AbhishekMani giải pháp khác là không lưu trữ chúng trong MongoDB. Giờ đây, vào năm 2018, việc ghi dữ liệu này vào một thứ như lưu trữ S3 hoặc Azure BLOB của Amazon dễ dàng hơn nhiều.
Gates VP

Tôi nghĩ những gì MongoDB nói
xinbenlv

64

"Bạn nên luôn luôn sử dụng GridFS để lưu trữ các tệp lớn hơn 16MB" - Khi nào tôi nên sử dụng GridFS?

Tài liệu MongoDB BSON được giới hạn ở mức 16 MB. Vì vậy, nếu tổng kích thước của mảng tệp của bạn nhỏ hơn số đó, bạn có thể lưu trữ chúng trực tiếp trong tài liệu của mình bằng kiểu dữ liệu BinData .

Video, hình ảnh, PDF, bảng tính, v.v. - không thành vấn đề, tất cả chúng đều được đối xử như nhau. Tùy thuộc vào ứng dụng của bạn để trả về một tiêu đề loại nội dung phù hợp để hiển thị chúng.

Kiểm tra tài liệu GridFS để biết thêm chi tiết.


24

Bạn có thể thử cái này:

String newFileName = "my-image";
File imageFile = new File("/users/victor/images/image.png");
GridFS gfsPhoto = new GridFS(db, "photo");
GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
gfsFile.setFilename(newFileName);
gfsFile.save();

13

http://blog.mongodb.org/post/183689081/storing-large-objects-and-files-in-mongodb

Có một plugin Mongoose có sẵn trên NPM được gọi là mongoose-file. Nó cho phép bạn thêm một trường tệp vào Lược đồ Mongoose để tải tệp lên. Tôi chưa bao giờ sử dụng nó nhưng nó có thể hữu ích. Nếu hình ảnh rất nhỏ, bạn có thể Base64 mã hóa chúng và lưu chuỗi vào cơ sở dữ liệu.

Lưu trữ một số tệp nhỏ (dưới 1 MB) bằng MongoDB trong NodeJS KHÔNG CÓ GridFS


8

Bạn có thể sử dụng kiểu dữ liệu bin nếu bạn đang sử dụng bất kỳ ngôn ngữ kịch bản lệnh nào để lưu trữ tệp / hình ảnh trong MongoDB. Dữ liệu Bin được phát triển để lưu trữ kích thước nhỏ của các tệp.

Tham khảo trình điều khiển ngôn ngữ kịch bản của bạn. Đối với PHP, bấm vào đây .


6

cài đặt bên dưới thư viện

var express = require(‘express’);
var fs = require(‘fs’);
var mongoose = require(‘mongoose’);
var Schema = mongoose.Schema;
var multer = require('multer');

kết nối bạn mongo db:

mongoose.connect(‘url_here’);

Xác định lược đồ cơ sở dữ liệu

var Item = new ItemSchema(
  { img: 
  { data: Buffer, contentType: String }
 }
);
var Item = mongoose.model('Clothes',ItemSchema);

sử dụng phần mềm trung gian Multer để tải ảnh lên phía máy chủ.

app.use(multer({ dest: ‘./uploads/’,
rename: function (fieldname, filename) {
return filename;
},
}));

đăng req lên db của chúng tôi

app.post(‘/api/photo’,function(req,res){
var newItem = new Item();
newItem.img.data = fs.readFileSync(req.files.userPhoto.path)
newItem.img.contentType = image/png’;
newItem.save();
});

Thưa ông, nếu tôi muốn thêm mảng Hình ảnh
Nikhil Patil

3
var upload = multer({dest: "./uploads"});
var mongo = require('mongodb');
var Grid = require("gridfs-stream");
Grid.mongo = mongo;

router.post('/:id', upload.array('photos', 200), function(req, res, next){
gfs = Grid(db);
var ss = req.files;
   for(var j=0; j<ss.length; j++){
     var originalName = ss[j].originalname;
     var filename = ss[j].filename;
     var writestream = gfs.createWriteStream({
         filename: originalName
     });
    fs.createReadStream("./uploads/" + filename).pipe(writestream);
   }
});

Theo quan điểm của bạn:

<form action="/" method="post" enctype="multipart/form-data">
<input type="file" name="photos">

Với mã này, bạn có thể thêm một ảnh cũng như nhiều ảnh trong MongoDB.


0

Điều này làm việc cho tôi,

  1. Đi vào thư mục này Trong CMD: - C: \ Chương trình tập tin \ MongoDB \ Server \ 4.0 \ bin
  2. thực hiện lệnh sau: - mongofiles đặt image.jpg
  3. đối với các tệp được chọn, chúng tôi sử dụng: - db.fs.files.find.pretty ()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.