Загрузка файлов с использованием RichFaces - PullRequest
8 голосов
/ 22 октября 2009

В настоящее время я пытаюсь загрузить некоторые файлы с помощью Java Server Faces. Я нашел это замечательное введение в него с помощью RichFaces. Однако у меня есть некоторые проблемы с пониманием процесса здесь.

Сначала пользователь выбирает файл, и если для немедленной загрузки задано значение true, файл обрабатывается с использованием ajax, пока что все хорошо. Однако, когда дело доходит до следующего шага, слушатель на Бобовой стороне меня смущает:

public void listener(UploadEvent event) throws Exception{
    UploadItem item = event.getUploadItem();

    File f = item.getFile();

    System.out.println(f.getAbsolutePath());
}

Абсолютный путь - к временному каталогу на моем компьютере, конечно, я понимаю, но как вы сделаете файл доступным для веб-приложения? Мое приложение развернуто как WAR-файл. Можно ли загрузить его в WAR? Звучит глупо или около того, но на самом деле это может быть удобно.

Я полностью осознаю, что могу переименовать файл, чтобы скопировать его в новое место, но так ли это?

Ответы [ 2 ]

5 голосов
/ 19 июля 2010

Не уверен, сколько это поможет (и, вероятно, слишком поздно!), Но этот код, который я использую на стороне сервера, эквивалентен вашему слушателю.

public String uploadFile(UploadEvent event) {
    UploadItem item = event.getUploadItem();

    String name = "unnamed_attachment";
    byte[] data = item.getData();

    try {
        name = FilenameUtils.getName(item.getFileName());
        data = FileUtils.readFileToByteArray(item.getFile());
        logger.info("data.length = " + data.length);
        UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant)

        details.setBytes(data);
        details.setResume(true);
        // Save to database here 

    } catch (Exception e) {
        FaceletsUtil.addSystemErrorMessage();
        logger.error(e, e);
    }
    return null;
}

Остается большой вопрос: «Как бы вы сделали файл доступным для веб-приложения?». Массив байтов доступен сразу. Если вы хотите повторно загрузить файл, вы можете предоставить его в виде ссылки на метод в компоненте JSF session / view, например:

<h:commandButton action="#{Manager.downloadFile}" value="Download report">                                </h:commandButton>

public void downloadFile() {
    final HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

    response.setHeader("Content-Disposition", "attachment;filename=radar-report" + new Date() + ".pdf"); // or whatever type you're sending back
    try {
        response.getOutputStream().write(uploadDetails.getBytes()); // from the UploadDetails bean
        response.setContentLength(uploadDetails.getBytes().length);
        response.getOutputStream().flush();
        response.getOutputStream().close();
    } catch (IOException e) {
        logger.error(e, e);  
    }
    FacesContext.getCurrentInstance().responseComplete();
}
5 голосов
/ 22 октября 2009

Запись вещей в ваш каталог WAR (при условии, что WAR даже взорван как каталог), как правило, плохая идея (по тем же причинам, что хранение ваших данных в каталоге вашего приложения, как правило, плохая идея).

Возможно, вы захотите, чтобы он попал в постоянное хранилище, обычно в базу данных. Как именно вы управляете, зависит от вас - используете ли вы файловую систему и сохраняете ссылку в базе данных или сохраняете BLOB-объект непосредственно в базе данных, используете ли вы JDBC или JPA или Hibernate и т. Д.

Список загруженных файлов можно затем прочитать из базы данных, обновив панель с их данными, используя что-то вроде <a4j:support event="onuploadcomplete" reRender="info" />.

Файл сервлета загрузки файлов (если у RichFaces его нет) написать довольно просто.

...