【发布时间】:2013-12-26 16:28:13
【问题描述】:
我有一个文件上传按钮,当用户上传文件时,ManagedBean 中的进程开始。此过程可能非常缓慢,我需要向用户显示进度。所以我有以下代码:
<p:fileUpload id="commandButtonIniciarImportacao"
disabled="#{importacaoArMB.produtoSelecionado == null}"
fileUploadListener="#{importacaoArMB.uploadArquivoImportacao}"
mode="advanced" auto="true" cancelLabel="Cancelar"
update=":formManterArquivoImportacao:tabViewManterArquivoImportacao:dataTableArs,
:formManterArquivoImportacao:tabViewManterArquivoImportacao:dataTableArsIgnorados"
label="Iniciar Importação..."
onstart="pbImportacao.start()" />
<p:progressBar widgetVar="pbImportacao" ajax="true" value="#{importacaoArMB.progresso}"
labelTemplate="#{value}%">
</p:progressBar>
在我的 managedBean 中,我有一个 getter 和 setter 来进行进度属性,我正在执行以下操作:
public void uploadArquivoImportacao(FileUploadEvent fileUploadedEvent) {
if (produtoSelecionado == null) {
addErrorMessage("Selecione o Produto antes de iniciar a importação");
FacesContext.getCurrentInstance().validationFailed();
return;
}
try {
addInfoMessage("Iniciando importação ...");
uploadedFile = fileUploadedEvent.getFile();
// Inicializando atributos do bean (ArquivoImportacao)
byte[] conteudoAsBytes = uploadedFile.getContents();
bean.setConteudo(new String(conteudoAsBytes));
bean.setDataHoraImportacao(new Date());
bean.setNome(uploadedFile.getFileName());
bean.setLayoutImportacao(produtoSelecionado.getLayoutImportacao());
arsIgnorados = getBoPadrao().gerarArsFromImportacao(bean, progresso);
addInfoMessage("Importação finalizada");
} catch (BOException bo) {
addErrorMessage(bo.getMessage());
FacesContext.getCurrentInstance().validationFailed();
} catch (Exception e) {
e.printStackTrace();
addErrorMessage(e.getMessage());
FacesContext.getCurrentInstance().validationFailed();
}
}
我将“progress”属性传递给我的 BO(业务对象),并且该属性的值在 FOR 的每个迭代器中递增。
问题是:progressBar 没有任何反应,从零继续。
【问题讨论】:
-
在高级模式中已经包含每个上传文件的进度条。我看不到您如何更新 progresso 变量。您是否按照here 的描述设置了过滤器和过滤器映射? -
我会解释:
-
好吧,我发现在 BO 中的所有进程结束后调用了“progressbar”,但我不知道为什么
-
好吧,我明白了,问题是你不能在文件上传时启动你的第二个进程,因为它太早了(此时进度条还没有启动......)。再说一句:标签模板不是EL表达式,所以
labelTemplate="{value}%"(这里不需要#)。 -
但是我该如何解决这个问题呢?上传文件后,我需要启动另一个进程。
标签: java jsf primefaces