2015-12-17 3 views
0

У меня не так много опыта Spring MVC. Я унаследовал некоторый RESTful кода контроллера, который находит запись в базе данных и используетВозвратите ModelAndView Spring MVC PDF-объект как сохраняемое приложение

org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView to create a PDF view of the record. 

Вот метод:

@RequestMapping(value = "/profile/{uniqueId}.pdf", method = RequestMethod.GET) 
@ResponseBody 
public ModelAndView getProfilePdf(HttpServletRequest request, @PathVariable("uniqueId") String uniqueId { 
    Profile profile = getProfileByUniqueId(request, uniqueId); 
    Map<String, Object> reportData = buildReportData(profile); 
    return new ModelAndView(profileReport, reportData); 
} 

Есть много поддержки объектов и методы, но так как я не могу вырезать и вставить код Я оставлю их сейчас.

В этом проблема. Когда URL-адрес вызывается, PDF создается и появляется в браузере. Если я отредактирую настройки браузера, я могу получить PDF-файл в Adobe Acrobat. Но я НЕОБХОДИМО для всплывающего окна, которое спрашивает вас, хотите ли вы открыть или сохранить файл.

Я считаю, что единственный способ сделать это - установить Content-disposition в приложении.

Поэтому я добавил «HttpServletResponse ответ» на параметры метода и добавил этот код:

response.setHeader("Content-disposition", "attachment; filename=profile.pdf"); 

Нет удачи. Я также попытался добавить тип контента:

response.setContentType("application/pdf"); 

Все еще не повезло.

Мне нужно узнать, как отправить объект ModelAndView в качестве вложения файла или, возможно, преобразовать его в поток байтов и вручную передать его обратно? Никакой подсказки здесь. Любые мысли были бы весьма признательны.

+1

Конфигурация 'JasperReportsPdfView' для использования правильных заголовков должна делать трюк. –

+0

Хорошо, я посмотрю. Brb. – PaulG

+0

Вид имеет свойство с именем 'headers', по умолчанию' content-disposition' устанавливается в 'inline'. Вы можете переключить его на «вложение», предоставив его жестко запрограммированным в конфигурации. Недостатком является то, что вы не можете указать имя документа, так как это также статично. –

ответ

1

По умолчанию JasperReportsPdfView устанавливает Content-Disposition в inline, но только если заголовок не предварительно сконфигурирован как что-то еще.

JasperReportsPdfView имеет свойство headers, в котором вы можете настроить или переопределить заголовки для отправки вместе с созданным PDF-файлом. Если вы включите заголовок Content-Disposition, вы можете установить его на что-то еще, в вашем случае attachment.

<bean id="yourreport" class="org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView"> 
    <property name="headers"> 
     <map> 
      <entry key="Content-Disposition" value="attachment; profile.pdf" /> 
     </map> 
    <property> 
</bean> 

Что-то вроде этого следует сделать трюк (Вместо map вы также можете использовать props элемент).

+0

Спасибо Deinum, это сделал трюк. Я добавил объект Properties с одной записью: «Content-Disposition», «attachment; filename = profile.pdf», а затем добавил, что объект Properties объект JasperReportPdfView с помощью setHeaders (Properties), и теперь вызов веб-службы вызывает всплывающее окно Сохранить/Открыть. Еще раз спасибо! – PaulG

0

что вам нужно сделать, это передать байты файла PDF непосредственно в выходной поток и сбросить ответ. Весной вы можете сделать это так:

@RequestMapping(value="/displayProcessFile/{processInstanceId}", method=RequestMethod.GET) 
public ResponseEntity<byte[]> displayProcessFile(@PathVariable String processInstanceId) throws UnauthorizedUserAccessException{ 
    Document processFile=null; 
    try { 
     processFile = documentService.retrieveProcessFile(Long.parseLong(processInstanceId)); 
    } catch (ProcessFileNotFoundExpection e) { 
     e.printStackTrace(); 
    } 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.parseMediaType("application/pdf")); 
    headers.add("content-disposition", "inline;filename=" + processFile.getDocName()); 
    ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(processFile.getContent(), headers, HttpStatus.OK); 
    return response; 
} 
+0

Да, но остается вопрос, как я могу преобразовать объект ModelAndView в массив байтов? Кажется, что нет никакого метода на этом объекте, чтобы помочь мне. – PaulG

-6

Может быть, вы должны изменить ваши настройки браузера, так что он будет просить каждый раз, прежде чем открыть файл напрямую.

Вы можете найти по ссылке: http://malektips.com/google-chrome-prompt-download-file.html#.VnLAgbiGRHw

Также вы должны установить:

response.setContentType ("приложение/загрузить");

response.setHeader («Content-disposition», «attachment; filename = profile.pdf»);

+0

Это наш вариант возврата, я бы предпочел не делать 3000 конечных пользователей изменять свои настройки браузера. :) – PaulG

Смежные вопросы