2013-08-20 9 views
9

Ho creato una chiamata di riposo che risponde con il file CSV utilizzando Jersey.resto della maglia e risposta CSV

codice di chiamata resto è:

@GET 
@Path("/ReportWithoutADEStatus") 
@Produces({ "application/ms-excel"}) 
public Response generateQurterlyReport(){ 
    QuarterlyLabelReport quartLabelReport = new QuarterlyLabelReport(); 
    String fileLoc=quartLabelReport.generateQurterlyLblRep(false); 
    File file=new File(fileLoc); 
    return Response.ok(fileLoc,"application/ms-excel") 
      .header("Content-Disposition","attachment;filename=QuarterlyReport_withoutADE.csv") 
      .build(); 
} 

Il codice precedente legge un file CSV creato in una posizione temporanea e risponde che csv utilizzando la chiamata di riposo. Questo funziona perfettamente bene. Ma ora il requisito è cambiato. in streaming il contenuto del file in memoria e rispondere in formato csv da Rest API.
Non ho mai eseguito lo streaming su un file in memoria e ho risposto al contenuto in REST.

Qualcuno può aiutarmi con questo?

Grazie in anticipo.

risposta

15

È necessario utilizzare StreamingResponse come entità di risposta. Nei miei progetti ho creato un metodo semplice per restituire questi elementi da un array di byte. Devi solo pronto il file in un byte sono, poi chiamare questo:

private StreamingOutput getOut(final byte[] excelBytes) { 
    return new StreamingOutput() { 
     @Override 
     public void write(OutputStream out) throws IOException, WebApplicationException { 
      out.write(excelBytes); 
     } 
    }; 
} 

Poi nel metodo principale che ci si qualcosa di simile:

return Response.ok(getOut(byteArray)).build(); //add content-disp stuff here too if wanted 
+0

Ha funzionato. Grazie per la soluzione. – ram

+0

Potrebbe contrassegnare la risposta come accettata quindi se questo è risolto. Grazie! –

+0

che dire di flush? – Dejell