Вопрос по jsf, java – Загрузка файла CSV с использованием JSF

5

Я не знаю, как загрузить файл CSV. CSV будет сгенерирован во время выполнения. Нужно ли сначала сохранять файл в каталоге WEB-INF tomcat? Я использую JSF 1.2.

Кстати, какой компонент JSF является предпочтительным для выполнения задач такого рода?

Изменить (05.05.2012 - 15:53)

Я попробовал решениеBalusC заявил в своем первомссылка на сайт, но если я нажму на кнопку command, содержимое файла отобразится на веб-странице. Может быть, проблема сmimetype?

XHTML-файл:

<code><a4j:form>
    <a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" />
</a4j:form>
</code>

основной боб:

<code>    public String doDataExport() {

    try {
        export.downloadFile();  
    } catch (SurveyException e) {
        hasErrors = true;
    }
    return "";
}
</code>

экспорт фасоли:

<code>public void downloadFile() throws SurveyException {

    try {

        String filename = "analysis.csv";

        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();

        response.reset();
        response.setContentType("text/comma-separated-values");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

        OutputStream output = response.getOutputStream();

        // writing just sample data
        List<String> strings = new ArrayList<String>();

        strings.add("filename" + ";" + "description" + "\n");
        strings.add(filename + ";" + "this is just a test" + "\n");

        for (String s : strings) {
            output.write(s.getBytes());
        }

        output.flush();
        output.close();

        fc.responseComplete();

    } catch (IOException e) {
        throw new SurveyException("an error occurred");
    }
}
</code>

Изменить (05.05.2012 - 16:27)

Я решил свою проблему. Я должен использовать<h:commandButton> вместо<a4j:commandButton> и теперь это работает!

Ваш Ответ

2   ответа
4

Do I need to save the file in the tomcat WEB-INF directory first?

Нет, просто запишите его прямо в тело ответа HTTP, когда вы получитеExternalContext#getResponseOutputStream() после установки правильных заголовков ответа, который сообщает браузеру, что он собирается получить.

Сделайте математику, основываясь на конкретных примерах, найденных в следующих ответах:

How to provide a file download from a JSF backing bean? JSP generating Excel spreadsheet (XLS) to download

В принципе:

List<List<Object>> csv = createItSomehow();
writeCsv(csv, ';', ec.getResponseOutputStream());

By the way, what's the favorite jsf-component for this kind of task?

Это субъективно. Но в любом случае мы используем<p:dataExporter> к полному удовлетворению.

Добро пожаловать. Действительно, вы не можете скачивать файлы с помощью ajax. Это также уже упоминалось в первой ссылке.
Если я используюa4j:components тогда это не сработало, но теперь я сменил<h:commandButton> и это работает правильно. Спасибо BalusC за еще один отличный ответ! yves.beutler
Я не думаю, что могу использоватьPrimeFacesпотому что они не поддерживают JSF 1.2, так какPrimeFaces 2.0 когда я прав? yves.beutler
Это верно, древний JSF 1.x близок к концу, поэтому вы не должны ожидать поддержки новой библиотеки компонентов. Просто продолжайте потоковую передачу вручную. Вам нужно только взять сырьеHttpServletResponse отExternalContext#getResponse() а потом зовет егоgetOutputStream() вместо этого, но это уже описано в первой ссылке. Или, конечно, обновить до JSF 2. Он предлагает так много преимуществ по сравнению с JSF 1.2.
Я знаю недостатки jsf 1.2, но в настоящее время мы не можем перейти на более высокий уровень. Я пытался понять вашу первую ссылку, но она не работает. Я использовал миметипtext/comma-separated-values Я нашел в Интернете, но браузеры (IE, FF, Chrome) не правильно его интерпретируют. yves.beutler
0


Вы можете взглянуть на этоссылка на сайт.

Если нет, вы можете сделать это так:

List<Object> report = new ArrayList<Object>(); // fill your arraylist with relevant data 
String filename = "report.csv";    
File file = new File(filename);
Writer output = new BufferedWriter(new FileWriter(file));
output.append("Column1");
output.append(",");
output.append("Column2");
output.append("\n");
//your data goes here, Replcae Object with your bean
for (Object row:report){
    output.append(row.field1);
    output.append(",");
    output.append(row.field2);
    output.append("\n");
}
output.flush();
output.close();

Похожие вопросы