2015-09-17 2 views
6

У меня есть код службы REST Ниже код, который возвращает файл, теперь проблема в корпусе ответа в PostMan Client. Я получаю исходный ответ, как я могу преобразовать его так, чтобы он отображал содержимое файла клиенту, цель должна возвращать файл пользователю .file имя «File1.jpeg»Обратный файл весной MVC REST

Код:

@RequestMapping(value = URIConstansts.GET_FILE, produces = { "application/json" }, method = RequestMethod.GET) 
public @ResponseBody ResponseEntity getFile(@RequestParam(value="fileName", required=false) String fileName,HttpServletRequest request) throws IOException{ 

    ResponseEntity respEntity = null; 

    byte[] reportBytes = null; 
    File result=new File("/home/arpit/Documents/PCAP/dummyPath/"+fileName); 

    if(result.exists()){ 
     InputStream inputStream = new FileInputStream("/home/arpit/Documents/PCAP/dummyPath/"+fileName); 


     byte[]out=org.apache.commons.io.IOUtils.toByteArray(inputStream); 

     HttpHeaders responseHeaders = new HttpHeaders(); 
     responseHeaders.add("content-disposition", "attachment; filename=" + fileName); 

     respEntity = new ResponseEntity(out, responseHeaders,HttpStatus.OK); 


    }else{ 

     respEntity = new ResponseEntity ("File Not Found", HttpStatus.OK); 
    } 


    return respEntity; 

} 

ответ

14

Код ниже решить мою проблему:

@RequestMapping(value = URIConstansts.GET_FILE, produces = { "application/json" }, method = RequestMethod.GET) 
public @ResponseBody ResponseEntity getFile(@RequestParam(value="fileName", required=false) String fileName,HttpServletRequest request) throws IOException{ 

    ResponseEntity respEntity = null; 

    byte[] reportBytes = null; 
    File result=new File("/home/arpit/Documents/PCAP/dummyPath/"+fileName); 

    if(result.exists()){ 
     InputStream inputStream = new FileInputStream("/home/arpit/Documents/PCAP/dummyPath/"+fileName); 
     String type=result.toURL().openConnection().guessContentTypeFromName(fileName); 

     byte[]out=org.apache.commons.io.IOUtils.toByteArray(inputStream); 

     HttpHeaders responseHeaders = new HttpHeaders(); 
     responseHeaders.add("content-disposition", "attachment; filename=" + fileName); 
     responseHeaders.add("Content-Type",type); 

     respEntity = new ResponseEntity(out, responseHeaders,HttpStatus.OK); 
    }else{ 
     respEntity = new ResponseEntity ("File Not Found", HttpStatus.OK); 
    } 
    return respEntity; 
} 
+0

Пожалуйста, объясните, почему он решает вашу проблему. – PhoneixS

+2

Работает отлично! Кстати, аннотация @ResponseBody не требуется. – Dante

+3

Обратите внимание, что весна имеет константы заголовка ответа 'org.springframework.http.HttpHeaders.CONTENT_DISPOSITION' и' org.springframework.http.HttpHeaders.CONTENT_TYPE', которые могут использоваться вместо строковых литералов. – chaserb

2

Вы должны использовать другой тип контента, а не производит = {application/json "}

Типы контента

http://silk.nih.gov/public/[email protected]

Если все еще не работает, то попытайтесь получить HttpServletResponse и записать данные файла в поток с response.setContentType();

Примечание: Недавно я использовал response.getOutputStream для записи файла Excel. Из-за некоторых причин установка производит не работал для меня.

Также вы можете использовать Firebug в firefox для просмотра заголовков ответов.

+0

IT работал, когда я добавил responseHeaders.setContentType (MediaType.IMAGE_JPEG); , но как я буду динамически устанавливать свой тип мультимедиа, поскольку он может быть txt, image, xml, js, mov any file –

+0

Если вы знаете расширения файлов, вы можете создать Pre-defiend Map для Extension-CotentType и использовать его для установки содержимого тип responseHeaders.setContentType (CONTENT_TYPES.get (расширение)); – DhruvG