2012-01-24 3 views
1

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

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

Таким образом, вопрос снова заключается в том, что это можно сделать одним щелчком мыши по командеLink?

EDIT, следующий комментарий 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 создаст первенствовать файл на заднем конце, сохраните его в/ресурсы/место, и легко открыть «сохранить» диалог на машине пользователя.

+0

Ответ: да. Есть ли у вас дополнительные вопросы? Пожалуйста, покажите и уточните, где именно вы застреваете, выполняя соответствующее требование. – BalusC

+0

Thank, BalusC. Я редактировал вопрос. – Herzog

ответ

5

Вы можете просто позволить 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(), которая записывает в нужную папку на диске.

+1

Я использую jxl, но это работает независимо. Красивый. – Herzog

+0

Добро пожаловать. – BalusC

+0

BalusC, я отредактировал вопрос с чем-то вроде ошибки, которую у меня есть. Если это не соответствует текущему вопросу, я удалю его. Благодарю. – Herzog

0

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

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