web-dev-qa-db-ja.com

GridFSTemplateを使用せずにSpringBootアプリケーションでmongodbのファイルをアップロードおよび取得するにはどうすればよいですか?

ファイルをアップロードして、spring bootアプリケーションのmongodbから取得したいと思います。しかし、私のfile size16 MBより大きくならないので、GridFSTemplateは使いたくありません。リンクに記載されている要件がないため、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("[email protected]");
document.setDocType("passport");
document.setDocument(file);
mongoTemplate.insert(document);

emailのようないくつかの情報と一緒にstore fileしたいです。後で、retrieveパラメータに基づいてこのfileemailします。このアプローチが良いか、または他のより良い解決策が評価されるかどうかを提案してください。

7
Sarvesh

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であることを確認してください。以下は、objectmonogodbに保存するためのコントローラーコードです。

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

このobjectmongodbから次のように取得できます。

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

これは理解のための単なるサンプル作業コードであることに注意してください。これは、設計原則を念頭に置いて、完全にオブジェクト指向の方法で記述できます。

7
Sarvesh