【问题标题】:How to save objects in GridFS without taking them from a file?如何在不从文件中获取对象的情况下将对象保存在 GridFS 中?
【发布时间】:2020-01-28 18:19:02
【问题描述】:

我正在使用可以接收非常大的对象并尝试将其保存在 MongoDB 数据库中的 Spring Boot api。因此,程序有时会抛出下一个错误:

org.bson.BsonMaximumSizeExceededException: Payload document size is larger than maximum of 16793600.

我听说 MongoDB 只允许大小低于 16MB 的对象,这对我的系统来说非常不方便,因为对象很容易超过这个差距。为了解决这个问题,我阅读了有关 GridFS 的信息,该技术允许超过 16MB 的文件间隙。

现在我正在尝试在我的系统中实现 GridFS,但我只看到使用文件保存在数据库中的示例,如下所示:

gridFsOperations.store(new FileInputStream("/Users/myuser/Desktop/text.txt"), "myText.txt", "text/plain", metaData);

但我想做的不是从文件中获取数据,而是到api接收对象并保存,如下所示:

@PostMapping
    public String save(@RequestBody Object object){
        DBObject metaData = new BasicDBObject();
        metaData.put("type", "data");
        gridFsOperations.store(object, metaData);
        return "Stored successfully...";
    }

这是一种可行的方法吗?

【问题讨论】:

    标签: java mongodb spring-boot gridfs


    【解决方案1】:

    从请求中获取InputStream 并将其传递给GridFSBucket。这是一个粗略的例子:

    在您的控制器中:

    @PostMapping
    public ResponseEntity<String> uploadFile(MultipartHttpServletRequest request)
    {
      Iterator<String> iterator = request.getFilenames();
      String filename = iterator.next();
    
      MultipartFile mf = request.getFile(filename);
    
      // I always have a service layer between controller and repository but for purposes of this example...
      myDao.uploadFile(filename, mf.getInputStream());
    }
    

    在您的 DAO/存储库中:

    private GridFSBucket bucket;
    
    @Autowired
    void setMongoDatabase(MongoDatabase db)
    {
      bucket = GridFSBuckets.create(db);
    }
    
    public ObjectId uploadFile(String filename, InputStream is)
    {
      Document metadata = new Document("type", "data");
      GridFSUploadOptions opts = new GridFSUploadOptions().metadata(metadata);
    
      ObjectId oid  = bucket.uploadFromStream(filename, is, opts);
    
      try
      {
         is.close();
      }
      catch (IOException ioe)
      {
        throw new UncheckedIOException(ioe);
      }
      
      return oid;
    }
    
    

    我从现有代码中解释了这一点,因此它可能并不完美,但足以为您指明正确的方向。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-10
      • 2022-12-20
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2018-09-17
      相关资源
      最近更新 更多