Действие ссылка и ссылка для скачивания в одном - PullRequest
1 голос
/ 24 января 2012

Мне нужно показать ссылку для загрузки файла на странице в приложении JSF 2.Теперь проблема в том, что файл содержит данные, которые зависят от свежего просмотра базы данных во время создания.Но я хочу создать его и дать пользователю ссылку для его загрузки одним действием.

Это было бы очень просто сделать в двух действиях: иметь кнопку для создания файла и заменить его ссылкой для загрузки файла после его создания.

Итак, снова вопрос: можно ли это сделать одним щелчком мыши по ссылке?

РЕДАКТИРОВАТЬ, следуя комментарию BalusC ниже.Вот специфика того, что я пытаюсь сделать, и сделал до сих пор.У меня есть это в xhtml:

<h:panelGroup rendered="#{!bean.showLinkToExcelFile()}">
     <h:form>
         <td><h:commandButton value="Generate list of your Bids for download" action="#{bean.createBidsList()}"/></td>      
    </h:form>
</h:panelGroup>
<h:panelGroup rendered="#{bean.showLinkToExcelFile()}">
    <td><a href="#{bean.findBidsListFileName()}">Download Your Bids</a></td>
</h:panelGroup> 

Это работает.Кнопка создает файл Excel, сохраняет его в определенном месте и обновляет имя файла в базе данных.Затем ссылка обслуживает файл.Но это двухступенчатый процесс для пользователя.То, что я хотел бы, это только один шаг.Таким образом, одна ссылка, например:

<a href="#{bean.findBidsListFileName()}">Download Your Bids</a>

или, скорее всего, jsf commandLink создаст файл Excel на серверной части, сохранит его в / resources / location и без проблем откроет «сохранить»."диалог на компьютере пользователя.

Ответы [ 2 ]

5 голосов
/ 25 января 2012

Вы можете просто позволить JSF немедленно записать отчет в OutputStream ответа HTTP вместо OutputStream файловой системы локального диска.

Вот базовый пример, предполагающий, что вы используете Apache POI для создания отчета Excel:

public void createAndDownloadBidsReport() throws IOException {
    // Prepare Excel report to be downloaded.
    HSSFWorkbook bidsReport = createBidsReportSomehow();
    String filename = "bids.xls";

    // Prepare response to show a Save As dialogue with Excel report.
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.setResponseContentType("application/vnd.ms-excel");
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

    // Write Excel report to response body.
    bidsReport.write(externalContext.getResponseOutputStream());

    // Inform JSF that response is completed and it thus doesn't have to navigate.
    facesContext.responseComplete();
}

Таким образом, вы можете получить только одну командную ссылку (или кнопку).

<h:form>
    <h:commandLink value="Create and download bids report" action="#{bean.createAndDownloadBidsReport}" />
</h:form>

Обратите внимание, что это не сохраняет его в файловой системе диска. Если вам действительно нужна копия, вам нужно добавить еще одну строку bidsReport.write(), которая записывает данные в нужное расположение файловой системы диска.

0 голосов
/ 24 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...