Использование загрузки файла RichFaces

Мне не нравится идея способности изменить объект от изменяемого до неизменного состояния, такой, кажется, побеждает точку дизайна мне. Когда необходимо сделать это? Только объекты, которые представляют ЗНАЧЕНИЯ, должны быть неизменны

8
задан Filip Ekberg 22 October 2009 в 08:28
поделиться

2 ответа

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

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

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

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

5
ответ дан 5 December 2019 в 17:39
поделиться

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

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-компоненте сеанса / просмотра, например:

<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
ответ дан 5 December 2019 в 17:39
поделиться
Другие вопросы по тегам:

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