ファイルをアップロードして、spring boot
アプリケーションのmongodb
から取得したいと思います。しかし、私のfile size
は16 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
パラメータに基づいてこのfile
をemail
します。このアプローチが良いか、または他のより良い解決策が評価されるかどうかを提案してください。
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";
}
このobject
はmongodb
から次のように取得できます。
@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";
}
これは理解のための単なるサンプル作業コードであることに注意してください。これは、設計原則を念頭に置いて、完全にオブジェクト指向の方法で記述できます。