Spring Data MongoDB : 保存二进制文件, GridFS例程

原文

在MongoDB中,可以使用GridFS来存储二进制文件。本教程将向你展示如何使用Spring Data GridFsTemplate来存储/读取MongoDB中的图像。

  1. GridFS – 保存示例(Spring配置文件采用注解方式)
    加一个图像文件并将其保存到MongoDB中。
    SpringMongoConfig.java:

    package com.mkyong.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
    import org.springframework.data.mongodb.gridfs.GridFsTemplate;
    
    import com.mongodb.Mongo;
    import com.mongodb.MongoClient;
    /**
     * Spring MongoDB configuration file
     *
     */
    @Configuration
    public class SpringMongoConfig extends AbstractMongoConfiguration{
    
        @Bean
        public GridFsTemplate gridFsTemplate() throws Exception {
            return new GridFsTemplate(mongoDbFactory(), mappingMongoConverter());
        }
    
        @Override
        protected String getDatabaseName() {
            return "yourdb";
        }
    
        @Override
        @Bean
        public Mongo mongo() throws Exception {
            return new MongoClient("127.0.0.1");
        }
    }
    

    GridFsAppStore.java

    package com.mkyong.core;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.data.mongodb.gridfs.GridFsOperations;
    
    import com.mkyong.config.SpringMongoConfig;
    import com.mongodb.BasicDBObject;
    import com.mongodb.DBObject;
    
    /**
    * GridFs example
    *
    * @author mkyong
    *
    */
    
    public class GridFsAppStore {
    
        public static void main(String[] args) {
    
            ApplicationContext ctx =
                 new AnnotationConfigApplicationContext(SpringMongoConfig.class);
            GridFsOperations gridOperations =
                  (GridFsOperations) ctx.getBean("gridFsTemplate");
    
            DBObject metaData = new BasicDBObject();
            metaData.put("extra1", "anything 1");
            metaData.put("extra2", "anything 2");
    
            InputStream inputStream = null;
            try {
                inputStream = new FileInputStream("/Users/mkyong/Downloads/testing.png");
                gridOperations.store(inputStream, "testing.png", "image/png", metaData);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("Done");
        }
    }
    

    查看MongoDB控制台,看看保存的内容。

    > show dbs
    yourdb  0.203125GB
    
    > use yourdb
    switched to db yourdb
    
    > show collections
    fs.chunks
    fs.files
    system.indexes
    
    > db.fs.files.find()
    { "_id" : ObjectId("51641c5630045c9b3db35afc"), "chunkSize" : NumberLong(262144),
    "length" : NumberLong(4238), "md5" : "9969527cd95a5a573f15e953f0036800", "filename" : "testing.png",
    "contentType" : "image/png", "uploadDate" : ISODate("2013-04-09T13:49:10.104Z"),
    "aliases" : null, "metadata" : { "extra1" : "anything 1", "extra2" : "anything 2" } }
    >
    
    > db.fs.chunks.find()
    { "_id" : ObjectId("51641c5630045c9b3db35afd"),
    "files_id" : ObjectId("51641c5630045c9b3db35afc"), "n" : 0,
    "data" : BinData(0,"/9j/4AAQSkZJRgABAgAAZ......EQH/9k=") }
    

    图像的信息保存在fs.files中,图像的具体内容(采用二进制编码)存储在fs.chunks中,并将_id和files_id进行关联。

  2. GridFS – 读取示例 (Spring配置文件采用XML方式)
    从MongoDB读取上述图像文件,并将其另存为另一个图像。
    SpringConfig.xml

    
    
    
        
        
    
        
            
            
        
    
    

    GridFsAppStore.java

    package com.mkyong.core;
    
    import java.io.IOException;
    import java.util.List;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.GenericXmlApplicationContext;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.gridfs.GridFsOperations;
    
    import com.mongodb.BasicDBObject;
    import com.mongodb.DBObject;
    import com.mongodb.gridfs.GridFSDBFile;
    
    /**
     * GridFs example
     *
     * @author mkyong
     *
     */
    
    public class GridFsAppRead {
    
        public static void main(String[] args) {
            ApplicationContext ctx =
                new GenericXmlApplicationContext("SpringConfig.xml");
            GridFsOperations gridOperations =
                (GridFsOperations) ctx.getBean("gridFsTemplate");
    
            List result = gridOperations.find(
                 new Query().addCriteria(Criteria.where("filename").is("testing.png")));
    
            for (GridFSDBFile file : result) {
                try {
                    System.out.println(file.getFilename());
                    System.out.println(file.getContentType());
                    //save as another image
                    file.writeTo("/Users/mkyong/Downloads/new-testing.png");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Done");
        }
    }
    

你可能感兴趣的:(Java编程)