Загрузка файла с помощью RichFaces

У меня уже есть следующие возможности для работы:

  1. Пользователь может загрузить файл (т.е. сжатый архив).
  2. Пользователь может распаковать файл на сервер
  3. Пользователь может выполнять некоторые операции с этими файлами, что приводит к созданию большего количества файлов.

Теперь мне нужно, чтобы шаг 4 работал:

  • Пользователь может снова загрузить файлы на свой компьютер

] Кто-нибудь может мне намекнуть? Я попытался разобраться в том, что нашел в Google, но он не работает должным образом. Нужно ли мне устанавливать тип контента? Когда я устанавливаю поток приложения / октета, только файлы txt и csv будут отображаться правильно (в браузере, а не как всплывающее окно загрузки, как я хотел), другие файлы не работали ...

JSP:

<a4j:commandLink value="Download" action="#{appController.downloadFile}" rendered="#{!file.directory}">
   <f:param name="file" value="#{file.absoluteFilename}" />
</a4j:commandLink>

appController:

public String downloadFile() {
    String filename = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("file");
    File file = new File(filename);
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();  

    writeOutContent(response, file, file.getName());

    FacesContext.getCurrentInstance().responseComplete();
    return null;
}

private void writeOutContent(final HttpServletResponse res, final File content, final String theFilename) {
    if (content == null) {
        return;
    }
    try {
        res.setHeader("Pragma", "no-cache");
        res.setDateHeader("Expires", 0);
        res.setHeader("Content-disposition", "attachment; filename=" + theFilename);
        FileInputStream fis = new FileInputStream(content);
        ServletOutputStream os = res.getOutputStream();
        int bt = fis.read();
        while (bt != -1) {
            os.write(bt);
            bt = fis.read();
        }
        os.flush();
        fis.close();
        os.close();
    } catch (final IOException ex) {
        Logger.getLogger(ApplicationController.class.getName()).log(Level.SEVERE, null, ex);
    }
}
6
задан dcernahoschi 1 February 2012 в 18:51
поделиться