如何在不使用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】:

我终于可以在不使用GridFSmongodb 中找到存储文件的方法。首先要注意的是,我们必须存储 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中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 &nbsp 的情况下在行内元素之间添加空格 [重复]

如何在不使用 Segue 的情况下在单独的 UIViewController 中选择实例变量

如何在不安装的情况下在应用程序中使用 Berkeley DB

如何在不使用滞后的情况下在偏移量旁边显示一列值

如何在不使用数据透视和反透视的情况下在 SQL Server 中水平显示数据?

如何在不使用模拟位置的情况下在 android 上欺骗位置?