Ответ 1
изменить
response.header("Content-Disposition", "attachment; filename=restfile.pdf");
to
response.header("Content-Disposition", "filename=restfile.pdf");
Я создаю pdf с отчетами о japser, и я хотел бы создать веб-службу REST, которая вернет этот PDF файл и отобразит его в браузере. Я уже пробовал код, отображаемый здесь:
Метод веб-служб REST для отображения pdf файла в браузере
Но таким образом загружается файл PDF. Я бы предпочел, чтобы он отображался в браузере первым, а затем, если пользователь хочет, чтобы он мог его загрузить позже.
(извините за дублированный вопрос, но, как вы видите, этот вопрос не ответил...)
EDIT:
Рабочий код службы REST:
@GET
@Path("/pdf")
@Produces("application/pdf")
public javax.ws.rs.core.Response getPdf() throws Exception
{
File file = new File("E:\\tmp\\test.pdf");
FileInputStream fileInputStream = new FileInputStream(file);
javax.ws.rs.core.Response.ResponseBuilder responseBuilder = javax.ws.rs.core.Response.ok((Object) fileInputStream);
responseBuilder.type("application/pdf");
responseBuilder.header("Content-Disposition", "filename=test.pdf");
return responseBuilder.build();
}
изменить
response.header("Content-Disposition", "attachment; filename=restfile.pdf");
to
response.header("Content-Disposition", "filename=restfile.pdf");
Сначала используя InputStream, мы можем загрузить файл во входной поток, а затем перейти к IOUtils.copy и использовать этот response.header("Content-Disposition", "attachment; filename=restfile.pdf")
для загрузки, использовать этот для предварительного просмотра response.setHeader("Content-disposition", " filename=" + output)
InputStream inputStream = new FileInputStream(new File(path)); // load the file
IOUtils.copy(inputStream, response.getOutputStream());
response.setContentType("application/pdf");
response.setHeader("Content-disposition", " filename=" + output);
response.flushBuffer();
Возвращаемым типом метода является `ResponseEntity
Вы можете легко сделать это с помощью JasperReportsViewResolver. Предполагая, что у вас есть источник данных, создайте определение bean следующим образом:
@Autowired
private DataSource dataSource;
@Bean
public JasperReportsViewResolver getJasperReportsViewResolver() {
JasperReportsViewResolver resolver = new JasperReportsViewResolver();
resolver.setPrefix("classpath:/reports/");
resolver.setSuffix(".jrxml");
resolver.setJdbcDataSource(dataSource);
resolver.setViewNames("rpt_*");
resolver.setViewClass(JasperReportsMultiFormatView.class);
resolver.setOrder(0);
return resolver;
}
Ваши отчеты будут находиться в каталоге /reports/
, и ваши отчеты начнутся с префикса rpt_
. Поэтому в папке reports
вы поместите свои файлы JRXML
.
И ваш метод сопоставления запросов будет выглядеть следующим образом:
@RequestMapping(value = "/report", method = RequestMethod.GET)
public ModelAndView showReport() {
ModelMap modelMap = new ModelMap();
modelMap.put("format", "pdf");
ModelAndView modelAndView = new ModelAndView("rpt_myReport", modelMap);
return modelAndView;
}
Вы можете в основном угрожать вашему отчету, как просто другому представлению. Файл будет открыт на новой вкладке с возможностью его загрузки, печати и т.д.
Следуя примеру @Branislav Lazic, способ, которым я нашел, - @Autowired
JasperReportsViewResolver
в вашем контроллере отчетов:
@Autowired
private JasperReportsViewResolver jrvr;
И переопределить (или обновить) свойство заголовка "Content-Disposition"
. Например:
...
final Properties properties = new Properties();
properties.setProperty("Content-Disposition", "attachment; filename=newReportName.xlsx");
jrvr.setHeaders(properties);
...
Я не знаю, лучший ли он, но отлично работает для меня.