Не уверен, сколько это поможет (и, вероятно, слишком поздно!), Но этот код, который я использую на стороне сервера, эквивалентен вашему слушателю.
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();
}