当前位置: 首页 > 知识库问答 >
问题:

如何在GridFS中保存对象而不从文件中取出?

甄成弘
2023-03-14

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

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...";
    }

这是一个可行的方法吗?

共有1个答案

钱锐
2023-03-14

从请求中获取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;
}

我从现有的代码中转述了这一点,所以它可能不是完美的,但会足够好,为您指明正确的方向。

 类似资料:
  • 问题内容: 我需要从GridFS下载简历,以下是为此目的编写的代码ive,但这似乎并没有给我提供下载的物理文件,而是用于读取内容的。如何下载文件? 问题答案: 希望这可以帮助!

  • 本文向大家介绍Java将对象保存到文件中/从文件中读取对象的方法,包括了Java将对象保存到文件中/从文件中读取对象的方法的使用技巧和注意事项,需要的朋友参考一下 1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: 参数obj一定要实现Serializable接口,否则会抛出java.io.NotSerializableExcept

  • 问题内容: noob Golang和Sinatra人在这里。我入侵了Sinatra应用程序,以接受从HTML表单发布的上传文件,并通过GridFS将其保存到托管的MongoDB数据库中。这似乎工作正常。我正在使用mgo驱动程序在Golang中编写相同的应用程序。 从功能上来说,它工作正常。但是在Golang代码中,我将文件读入内存,然后使用mgo将文件从内存写入MongoDB。这似乎比我同等的Si

  • 本文向大家介绍在MongoDB中如何获取保存的对象?,包括了在MongoDB中如何获取保存的对象?的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个变量。以下是查询- 以下是使用save()保存记录的查询- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

  • 问题内容: 我想将一个对象保存到文件中,然后轻松地从文件中读取它。作为一个简单的示例,可以说我有以下3d数组: 是否有一个简单的Ruby API,无需编程解析器即可解释文件中的数据,就可以用来实现此目的?在示例中,我给出了一个简单的例子,但是随着对象变得越来越复杂,使对象持久化变得很烦人。 问题答案: 参见元帅:http : //ruby- doc.org/core/classes/Marshal

  • 问题内容: 我正在编写我的第一个烧瓶应用程序。我正在处理文件上传,基本上我想要的是读取上传文件的数据/内容而不保存它,然后将其打印在结果页面上。是的,我假设用户始终上传一个文本文件。 这是我正在使用的简单上传功能: 现在,我正在保存文件,但是我需要的是一个’a’变量来包含文件的内容/数据。 问题答案: 包含字段。该对象必须扩展IO或文件对象,因此它必须包含read和其他类似方法。还扩展了strea