2017-07-09 3 views
0

Ich möchte das PDF (als BLOB gespeichert) aus der Datenbank mit Trikot api Ich verwende mybatis als Datenbank Framework. Ich bin in der Lage, die pdf herunterladen, aber das Problem ist, ich bekomme den Eingabestream als Datenbank, die ich es als Datei speichern und dann übergeben, dass es in Response, aber ich möchte diese Datei nicht im Server speichern, ich will Datei direkt zum Benutzer heruntergeladen werden.Laden Sie die Datei aus der Datenbank, ohne sie auf dem Server zu speichern

Aktuelle Prozess:

DATABASE -------> Eingabestrom -----> Datei -----------> zur Antwort hinzufügen ----- > Benutzer herunterlädt

  retrieving  making file passing file   user downloads 

, was ich will:

DATABASE ----------> Eingabestrom ------------> in den Antwort -------> Benutzer lädt es herunter

  retrieving   passing file    user downloads 

Ich möchte Datei entfernen in Server als Daten machen, ist vertraulich

Ressourcen Schnittstelle

@GET 
@Path("v1/download/{id}") 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response downloadFile(@PathParam("id") int id) throws IOException, SQLException; 

Ressourcen Impl

@Override 
public Response downloadFile(int id) throws IOException, SQLException { 
    // TODO Auto-generated method stub 
    File file = fileUploadService.downloadFile(id); 

    ResponseBuilder response = Response.ok(file); 
    response.header("Content-Disposition", "attachment;filename=aman.pdf"); 
    return response.build(); 
} 

Service-Methode

@Override 
public File downloadFile(int id) throws IOException { 
    // TODO Auto-generated method stub 
    File fil=new File("src/main/resources/Sample.pdf"); 
    FileUploadModel fm =mapper.downloadFile(id); 
    InputStream inputStream = fm.getDaFile(); 
    outputStream = new FileOutputStream(fil); 
    int read = 0; 
    byte[] bytes = new byte[102400000]; 

    while ((read = inputStream.read(bytes)) != -1) { 
     outputStream.write(bytes, 0, read); 
    } 
    return fil; 
} 

Diese c ode funktioniert, aber ich möchte das Erstellen von Datei auf der Serverseite, d. h. ich möchte Datei fil = neue Datei entfernen ("src/main/resources/Sample.pdf"), diese Operation, die in Service-Methode ist.

Vielen Dank im Voraus.

Antwort

2

Anstatt Datei zu verwenden, verwenden Sie ByteArrayOutputStream und schreiben Sie darauf. Dann geben Sie das Ergebnis als ein Byte [] zurück, das Sie an Ihre Response.ok (Inhalt) übergeben können.

Hat dies nicht testen, aber so etwas wie:

public byte[] downloadFile(int id) throws IOException { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    FileUploadModel fm =mapper.downloadFile(id); 
    InputStream inputStream = fm.getDaFile(); 
    int read = 0; 
    byte[] bytes = new byte[1024]; 

    while ((read = inputStream.read(bytes)) != -1) { 
     out.write(bytes, 0, read); 
    } 
    return out.toByteArray(); 
} 

Auch das ist eine Menge von Bytes zu einem Array zuzuordnen. Sie können mit dem experimentieren, was für Sie funktioniert, aber etwas wie 1024 wäre wahrscheinlich völlig ausreichend.

Sie möchten wahrscheinlich auch eine weitere Kopfzeile zu Ihrer Antwort für Content-Type hinzufügen.

+0

Es funktioniert. Danke vielmals . – Aman

Verwandte Themen