2015-06-30 2 views
0

Моего требования для PDF загрузки является:PDF скачать в новом окне в Java

  1. Когда пользователь нажимает на ссылку «Скачать», передний конец будет POST через JSON данные в фоновом.
  2. Back-end обрабатывает JSON, генерируя файл PDF из его параметров.
  3. В ответ I (back-end) необходимо отправить ссылку для загрузки и уникальный идентификатор документа.
  4. Frond-end откроет эту ссылку (GET) в новом окне, которая попадет в конец и начнется загрузка.

Как мне это сделать?

Заранее спасибо.

+0

Что вы пробовали? У вас есть массив байтов PDF? Вы используете простой сервлет Java для сопоставления URL-адреса загрузки? Как json будет отправлен от клиента? Это POST? ПОЛУЧИТЬ? Пожалуйста, дополните. –

+0

Я использую весну. Данные JSON будут поступать в запрос POST. После этого я создаю отчет JASPER, используя эти данные. – user2758176

ответ

2

Если вы используете 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, сопоставляя его.

+0

Не могли бы вы также поделиться примером кода для getFromStore (uniqueId) – user2758176

+0

Я добавил примерную реализацию на контроллере. –

+0

Это 'getFromStore()' будет 'reportFileStore.getFile()', я думаю ... Также 'deleteFileFromStore()' будет 'reportFileStore.deletFile()' ... –

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