2017-11-20 4 views
3

Ich möchte Dateien hochladen und sie von mongodb in Anwendung abgerufen werden. Aber ich will nicht GridFSTemplate verwenden, weil mein file size nicht größer sein als 16 MB. Ich wähle nicht GridFSTemplate, weil keine der Anforderungen, die in Verbindung https://docs.mongodb.com/manual/core/gridfs/#faq-developers-when-to-use-gridfs erwähnt werden, meine Anforderungen nicht erfüllen. mit Document Arbeitsdateien zu speichern und abzurufen sie MongoTemplate ein guter Ansatz? MyDocument Definition aussehen wirdWie hochzuladen und abzurufen Datei in mongodb in Spring-Boot-Anwendung ohne GridFSTemplate?

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

Datei speichern

MyDocument document = new MyDocument(); 
document.setEmailId("[email protected]"); 
document.setDocType("passport"); 
document.setDocument(file); 
mongoTemplate.insert(document); 

ich store file will zusammen mit Informationen wie email. Später werde ich retrieve diese file basierend auf email Parameter. Bitte schlagen Sie vor, ob dieser Ansatz gut ist oder eine andere bessere Lösung geschätzt wird.

Antwort

0

Ich konnte endlich den Weg zum Speichern von Dateien ohne GridFS in mongodb herausfinden. Das erste, was Sie beachten müssen, dass wir byte[] Darstellung der Datei speichern müssen.

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

Stellen Sie sicher, dass Ihr Dateiobjekt org.bson.types.Binary ist. Folgendes ist mein Controller-Code zum Speichern object in 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"; 
} 

Sie können diese object von mongodb wie folgt abrufen.

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

Bitte beachten Sie, dies ist nur Beispielarbeitscode für das Verständnis. Es kann in vollständig objektorientierter Weise geschrieben werden, wobei Designprinzipien im Auge behalten werden.

Verwandte Themen