Как загрузить и получить файл в mongodb в приложении весенней загрузки без использования GridFSTemplate?
Я хочу загрузить файлы и извлечь их из mongodb
в spring boot
приложение. Но я не хочу использовать GridFSTemplate
потому что мой file size
не будет больше чем 16 MB
, Я не выбираю GridFSTemplate
потому что ни одно из требований, упомянутых в ссылке https://docs.mongodb.com/manual/core/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
, Позже я буду retrieve
этот file
основанный на email
параметр. Пожалуйста, предложите, если этот подход хорош или любое другое лучшее решение приветствуется.
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";
}
Вы можете получить это 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";
}
Обратите внимание, что это просто пример рабочего кода для понимания. Это может быть написано полностью объектно-ориентированным способом, помня принципы дизайна.