2016-11-18 5 views
1

Ich verwende REST Web Services von Spring Framework. Ich muss ein Excel-Blatt herunterladen, aber ich muss auch das Blatt auf der Grundlage einiger ausgewählter Parameter herunterladen. Ich sende ein Anfrage-Klasse-Objekt als der Körper zu einem POST Ruhe-Anruf (@RequestBody)Herunterladen von Excel mit POST Rest Service

Ich konnte das Excel nicht mit einer POST-Methode herunterladen. Bitte helfen Sie mir, dies zu erreichen.

@RequestMapping(value = "/search/export", method = RequestMethod.POST,, produces = MediaType.APPLICATION_JSON_VALUE) 
public void searchResultToExcel(@RequestBody SearchRequest searchRequest, HttpServletResponse response, HttpServletRequest request) throws Exception 

Dies ist meine Methode Unterschrift

+0

Warum verwenden Sie POST? Warum nicht ein GET mit den Suchparametern in der Abfragezeichenfolge verwenden? – jannis

+0

die Suchparameter ist eine Art eines Objekts :( – jasmeet24

+0

Sie sagen, dass Sie nicht die Kontrolle über die Frontend-App haben? – jannis

Antwort

1

ich diesen Thread Return Excel downloadable file from Spring gefunden haben, die nützlich sein können.

Ich denke auch, dass Content-Typ, den Sie erzwingen (produziert = MediaType.APPLICATION_JSON_VALUE) im Weg sein könnte, zumindest so weit ich die Frage verstehen konnte. Ich denke, Sie sollten dort einen EXCEL-Inhaltstyp erzwingen (application/vnd.ms-excel).

Dort heißt es:

Sie müssen den Content-Disposition Header setzen.

response.setHeader("Content-disposition","attachment; filename=" + yourFileName); 

und schreiben Sie Ihre Bytes direkt in die Antwort OutputStream.

File xls = new File("exported.xls"); // or whatever your file is 
FileInputStream in = new FileInputStream(xls); 
OutputStream out = response.getOutputStream(); 

byte[] buffer= new byte[8192]; // use bigger if you want 
int length = 0; 

while ((length = in.read(buffer)) > 0){ 
    out.write(buffer, 0, length); 
} 
in.close(); 
out.close(); 

oben Das ist relativ alt. Sie können jetzt eine ResponseEntity mit FileSystemResource konstruieren. Ein ResourceHttpMessageConverter wird dann die Bytes, wie ich oben vorgeschlagen habe, für Sie kopieren. Spring MVC macht es einfacher für Sie, als dass Sie mit Interfaces aus der Servlet-Spezifikation interagieren.

0
@Post 
@Path("downloadMyReport") 
@Produces("application/excel") 
public static Response generatemyExcelReport()throws BusinessException  { 
    try { 
     File file=null; 
     Date reportDate=new Date() ; 

     path="/home/Documents/excelReport/" 
     file=getReportByName(path); 

     if(file==null){ 
      logger.info("File is null"); 

     else{ 
       name=capitalizeFirstLater(name); 

      getReportSummary(reportDate); 
      FileUtils.writeByteArrayToFile(new File(path),createExcelForReport(fileName,path)); 
      file=getReportByName(path); 
     } 


     ResponseBuilder response = Response.ok(file); 
     response.header("Content-Disposition", "attachment; filename=\"" + fileName2 + "\""); 
     return response.build(); 

    } 
    }catch (BusinessException e) { 
     throw e; 
    }catch (Exception e) { 
     logger.error("Exception while generating ExcelSheetForMyReport {}",Utils.getStackTrace(e)); 
     throw new BusinessException("Error in downloading ExcelSheetForMyReport"); 
    } 

} 
0

ResponseBuilder Antwort = Response.ok (Datei); response.header ("Content-Disposition", "Anhang; Dateiname = \" "+ Dateiname2 +" \ ""); Rückgabe response.build();