Если вы используете Spring вы создаете контроллер
@Controller
@RequestMapping(value = "/report")
public class ReportController {
@Autowired
ReportFileStore reportFileStore;
@RequestMapping(value = "/download/{uniqueId}", method = RequestMethod.GET)
public void getFile(@PathVariable("uniqueId") String uniqueId, HttpServletResponse response) {
//Find the generated PDF from somewhere, might be a disk, or RAM
byte[] pdf = getFromStore(uniqueId);
writeToResponse(pdf,response);
deleteFileFromStore(uniqueId);
}
private byte[] getFromStore(String uniqueId){
return reportFileStore.getFile(uniqueId);
}
}
Метод writeToResponse
стандартный сервлет скачать код, вы можете увидеть пример here или here.
Об getFromStore
, это простой способ получить байт [] PDF, сгенерированный из Jasper, при создании вы можете использовать метод put, который хранит байт [] с уникальным идентификатором.
Я хотел бы использовать интерфейс как этот
public interface ReportFileStore {
void storeFile(String uniqueId,byte[] content);
byte[] getFile(String uniqueId);
InputStream getFile(String uniqueId);
void deleteFile(String uniqueId);
}
и реализовать его с помощью VFS отображается на RAM или диск.
Конечно, на ваше поколение PDF, вам нужно создать уникальный идентификатор для этого, вы можете попробовать использовать UUID. Используйте этот UUID с ReportFileStore
, чтобы сохранить файл PDF. Неясно, можно ли «вернуть ссылку на скачивание и уникальный идентификатор», просто вернув uniqueId, а затем жестко кодировать местоположение загрузки на интерфейсе. Если нет, верните JSON, сопоставляя его.
Что вы пробовали? У вас есть массив байтов PDF? Вы используете простой сервлет Java для сопоставления URL-адреса загрузки? Как json будет отправлен от клиента? Это POST? ПОЛУЧИТЬ? Пожалуйста, дополните. –
Я использую весну. Данные JSON будут поступать в запрос POST. После этого я создаю отчет JASPER, используя эти данные. – user2758176