Мне не нравится идея способности изменить объект от изменяемого до неизменного состояния, такой, кажется, побеждает точку дизайна мне. Когда необходимо сделать это? Только объекты, которые представляют ЗНАЧЕНИЯ, должны быть неизменны
Запись чего-либо в ваш каталог WAR (при условии, что WAR даже взорвана как каталог), как правило, является плохой идеей (по тем же причинам, по которым хранение ваших данных в каталоге вашего приложения обычно плохая идея).
Вы, вероятно, захотите, чтобы он попал в хранилище постоянства, обычно в базу данных. Как именно вы это сделаете, зависит от вас - используете ли вы файловую систему и храните ссылку в базе данных или храните большой двоичный объект в базе данных напрямую, и используете ли вы JDBC, JPA или Hibernate и т. Д.
Список загруженных файлы затем можно было прочитать из базы данных, обновив панель, которая их содержала, используя что-то вроде
.
Сервлет загрузки файлов (если RichFaces его нет) довольно легко написать.
Не уверен, насколько это помогает (и, вероятно, уже слишком поздно!), Но это код, который я использую на стороне сервера, он эквивалентен вашему слушателю.
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();
}