2010-11-22 10 views

cevap

37

Resimler gibi ikili verileri depolamak için GridFS'u kullanabilir veya kendi gerçekleştirme sürecinizi gerçekleştirebilirsiniz; driver'u indirin ve src/test/com/mongodb/gridfs/GridFSTest.java'a bakın;)

Düzenleme: Bugün şanslısınız! Sizin için eksiksiz bir kod hazırladım;) Enjoy! küçük (< 1mb) için

package mongodb.testing.java; 
import com.mongodb.*; 
import com.mongodb.gridfs.*; 
import java.io.*; 

public class Main { 

    public static byte[] LoadImage(String filePath) throws Exception { 
     File file = new File(filePath); 
     int size = (int)file.length(); 
     byte[] buffer = new byte[size]; 
     FileInputStream in = new FileInputStream(file); 
     in.read(buffer); 
     in.close(); 
     return buffer; 
    } 

    public static void main(String[] args) throws Exception { 
     //Load our image 
     byte[] imageBytes = LoadImage("C:/Temp/bear.bmp"); 
     //Connect to database 
     Mongo mongo = new Mongo("127.0.0.1"); 
     String dbName = "GridFSTestJava"; 
     DB db = mongo.getDB(dbName); 
     //Create GridFS object 
     GridFS fs = new GridFS(db); 
     //Save image into database 
     GridFSInputFile in = fs.createFile(imageBytes); 
     in.save(); 

     //Find saved image 
     GridFSDBFile out = fs.findOne(new BasicDBObject("_id" , in.getId())); 

     //Save loaded image from database into new image file 
     FileOutputStream outputImage = new FileOutputStream("C:/Temp/bearCopy.bmp"); 
     out.writeTo(outputImage); 
     outputImage.close(); 
    } 
} 
+0

teşekkürler. Aynı süreç için bir kod da yaptım. Ama seninki benimkinden basit! –

+0

Yani, bir html dosyasına yazmak için sunucudaki resim konumunu HTML'ye gönderir misiniz? – Jeff

+0

Özellikle 'LoadImage' yöntemi için çok teşekkür ederim. –

2

Eh, AFAIK, görüntüleri mongodb depolayamazsınız, görüntülerin bağlantılarını saklayabilirsiniz. Ve ben bunu söylediğim kadar yüksek değilim, eğer görüntüler küçükse, 100x100 px gibi, U imajı ikili olarak depolamayı ve baskı ve imajı anında deneyebilir. Ancak, görüntüleri işlemek biraz zaman alacaktır ve bu yüzden bağlantıyı kaydetmenizi ve sadece bu görüntüyü getirmenizi ve dinamik olarak doldurmanızı öneririm.

Daha büyük ikili nesneleri depolamak için GridFS'yi kullanabilirsiniz. Eğer mongodb yeni olduğunuz

, bir göz atın:

Link 1

Link 2

Mongo+JAVA Tutorial

GridFS specs

Ayrıca her zaman SO, ben üzerinde sorabilir ayrıca mongoDB için yeni ve birlikte bir acemi yardımcı olur: D

+0

GridFS dosyasını düz bir belgeye nasıl bağlar mongodb. Diyelim ki, büyük bir resim yüklüyorum ve onu GridFS'de saklıyorum. Herhangi bir koleksiyondaki dosyanın diğer detaylarını bir belgede saklıyorum. Belgeyi koleksiyondan okuduğumda ilişkili resmi nasıl alabilirim ??? –

+1

Bunu yapmak için herhangi bir API yöntemi olup olmadığını bilmiyorum, her iki koleksiyonda bir alan oluşturarak, aynı değerlerle, bunlar arasında bir bağlantı yaratırsınız. Dolayısıyla, ilk koleksiyondaki değere rastladığınızda, jsut görüntü koleksiyonunu değerle sorgular ve karşılık gelen görüntüye rastlarsınız. Kodunuz için – theTuxRacer

5

görüntüleri bir ikili alanda depolayarak öneririm (byte [] java); Daha büyük dosyalarınız varsa GridFS daha iyi çalışır.

Belgelerime doğrudan basit bir ikili alan kullanarak birçok küçük resim kaydediyorum.

POJO'larımı saklamak için Morphia'yı (http://code.google.com/p/morphia) kullanırım.

+0

Görüntülerin bir çoğunu mongo'da saklayacağım. Her iki küçük resim ve sıradan boyut. Pojo benim için gerekli mi ?? –

+0

Bana Mongo'daki görüntüleri nasıl temsil ettiğinizi söyler misiniz? gibi, {"x": 1, "y": 2} görüntüleri nasıl temsil ediyorsunuz ???? –

+0

Resimlerinizi nasıl depolarsınız? Hepsi bir arada mı? veya bir koleksiyondaki ayrı belgeler mi?veya "{" name ":" Tamil "," age ": 23," Images "{" image1 ": 123.jpg," image2 ": abc.jpg gibi görünen bir belgeye birden çok görüntü kaydetmek istiyorsam }} 'java ile nasıl yapmalıyım –