如何在不使用GridFSTemplate的情况下在spring boot应用程序中上传和检索mongodb中的文件?
Posted
技术标签:
【中文标题】如何在不使用GridFSTemplate的情况下在spring boot应用程序中上传和检索mongodb中的文件?【英文标题】:How to upload and retrieve file in mongodb in spring boot application without using GridFSTemplate? 【发布时间】:2018-05-03 12:23:35 【问题描述】:我想在spring boot
应用程序中上传文件并从mongodb
检索它们。但我不想使用GridFSTemplate
,因为我的file size
不会大于16 MB
。我没有选择GridFSTemplate
,因为链接https://docs.mongodb.com/manual/core/gridfs/#faq-developers-when-to-use-gridfs 中提到的所有要求都不符合我的要求。
使用Document
保存文件并使用MongoTemplate
检索它们是一种好方法吗?
MyDocument 定义看起来像
@Document
public class MyDocument
@Id
private String id;
private String emailId;
private String docType;
@CreatedDate
private DateTime created;
@LastModifiedDate
private DateTime modified;
private File document;
存储文件
MyDocument document = new MyDocument();
document.setEmailId("abc@gmail.com");
document.setDocType("passport");
document.setDocument(file);
mongoTemplate.insert(document);
我想store file
以及email
之类的一些信息。稍后我将根据email
参数retrieve
这个file
。
请提出这种方法是否良好或任何其他更好的解决方案是否受到赞赏。
【问题讨论】:
【参考方案1】:我终于可以在不使用GridFS
的mongodb
中找到存储文件的方法。首先要注意的是,我们必须存储 byte[]
文件的表示形式。
import org.bson.types.Binary;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Document
public class DemoDocument
@Id
@Field
private String id;
@Field
private String emailId;
@Field
private String docType;
@Field
private Binary file;
确保您的文件对象是org.bson.types.Binary
。
以下是我将object
保存在monogodb
中的控制器代码。
@PostMapping("/upload")
public String singleFileUpload(@RequestParam("file") MultipartFile multipart, @RequestParam("email") String email)
try
DemoDocument demoDocument = new DemoDocument();
demoDocument.setEmailId(email);
demoDocument.setDocType("pictures");
demoDocument.setDocument(new Binary(BsonBinarySubType.BINARY, multipart.getBytes()));
mongoTemplate.insert(demoDocument);
System.out.println(demoDocument);
catch (Exception e)
e.printStackTrace();
return "failure";
return "success";
您可以从mongodb
检索此object
,如下所示。
@PostMapping("/retrieve")
public String retrieveFile(@RequestParam("email") String email)
DemoDocument demoDocument = mongoTemplate.findOne(new BasicQuery("emailId : \""+email+"\", docType : \"pictures\""), DemoDocument.class);
System.out.println(demoDocument);
Binary document = demoDocument.getDocument();
if(document != null)
FileOutputStream fileOuputStream = null;
try
fileOuputStream = new FileOutputStream(RETRIEVE_FOLDER + "prof_pic.jpg");
fileOuputStream.write(document.getData());
catch (Exception e)
e.printStackTrace();
return "failure";
finally
if (fileOuputStream != null)
try
fileOuputStream.close();
catch (IOException e)
e.printStackTrace();
return "failure";
return "success";
请注意,这只是用于理解的示例工作代码。它可以以完全面向对象的方式编写,同时牢记设计原则。
【讨论】:
您的示例确实节省了我的时间,在我搜索的所有地方,我只能看到 GridFS GridFS GridFS ....以上是关于如何在不使用GridFSTemplate的情况下在spring boot应用程序中上传和检索mongodb中的文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用   的情况下在行内元素之间添加空格 [重复]
如何在不使用 Segue 的情况下在单独的 UIViewController 中选择实例变量
如何在不安装的情况下在应用程序中使用 Berkeley DB