У меня есть p: fileUpload, который отлично работает. Но мне нужно частичное отображение страницы p: datatable после того, как был загружен новый файл. В файле datatable отображаются текущие файлы.Прямолинейный частичный рендеринг страниц не работает с <p: fileUpload>
Странно, что, как только я загружу один файл, таблица перезаписана, показывая одну запись. Но во второй раз, когда таблица не перезагружена, ПОКАЗЫВАЕТ, что код показывает 2 записи. Это раздувает мой разум, я потратил весь день, пытаясь заставить это работать. На данный момент у меня есть обходной путь с использованием ui: repeat.
Вот код
<h:outputLabel value="Files Upload" style="font-weight: bold;" />
<p:fieldset>
<p:fileUpload id="iconUpload" update="@form"
fileUploadListener="#{appCreateController.processUpload}"
image="/resources/gfx/file_browse_normal.png"
allowTypes="*.jpg;*.png;*.gif;*.doc;*.exe;*.msi"
description="Icon">
</p:fileUpload>
</p:fieldset>
<p:message for="iconUpload" />
<p:dataTable var="appFile" id="appFiles"
value="#{appCreateController.uploadedFiles}" rows="10">
<p:column>
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{appFile.uploadedFile.fileName}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Content Type" />
</f:facet>
<h:outputText value="#{appFile.uploadedFile.contentType}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="File Type" />
</f:facet>
<h:selectOneMenu value="#{appFile.uploadedFileType}" id="fileType">
<f:selectItems var="uploadedFileType"
value="#{appCreateController.uploadedFileTypes}"
itemLabel="#{uploadedFileType.name}" />
</h:selectOneMenu>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Size" />
</f:facet>
<h:outputText value="#{appFile.size}" />
</p:column>
</p:dataTable>
Архивация Код боб:
public void processUpload(FileUploadEvent event)
throws AbortProcessingException {
log.debug("Uploading file: " + event.getFile().getFileName());
UploadedFileVO uploadedFileVO = new UploadedFileVO();
uploadedFileVO.setUploadedFile(event.getFile());
uploadedFiles.add(uploadedFileVO);
log.debug("Uploaded file: " + event.getFile().getFileName());
log.debug("file list now contains file : " + uploadedFiles.size());
}
public List<UploadedFileVO> getUploadedFiles() {
log.debug("Getting uploadedFiles. Total == " + uploadedFiles.size());
return uploadedFiles;
}
public UploadedFileType[] getUploadedFileTypes() {
return UploadedFileType.values();
}
Надежда кто-нибудь знает решение :)
Приветствия, Коэнов
Возможно, вместо использования 'update = @ form' вы можете использовать' update = [formid]: appFiles'. Также я предполагаю, что UploadedFileVO - простая оболочка для загруженного файла Primefaces. Назначая его таким образом, возможно, что все ваши объекты-обертки могут фактически указывать на один и тот же загруженный файл. Если вы переопределили 'equals' и' hashCode' для вашей обертки, а 'uploadedFiles' - это наборная коллекция, тогда он может считать оба файла равными и сохранить только один в коллекции. –
... а также какую версию и реализацию JSF вы используете и какую версию Prime? –
Хорошо, я пробовал с 2.2.1 и обновил эту проблему до 3.0.1. Теперь это исправлено. У меня был другой метод, который, в свою очередь, назывался getUploadedFiles() до того, как страница xhtml сделала это, это повлияло на перенаселение данных. –