File upload Primefaces p:fileUpload-在上传开始和结束时做一些事情(多个文件)

File upload Primefaces p:fileUpload-在上传开始和结束时做一些事情(多个文件),file-upload,primefaces,File Upload,Primefaces,Primefaces 4.0有一个很好的组件来上传文件,包括一次上传多个文件。由于某种黑暗的奇迹,它实际上起了作用 代码: 问题是侦听器someBean.handleSingleFileUpload对每个文件调用一次。我很好地处理了这个问题,但在整个上传过程的开始和结束时,我看不到任何执行代码的方法。海事组织有相当大的监督 例如: 开始时清除信息文本区域 现在多个文件同时上传 最后根据刚刚上传的数据重新加载内容 当然,无论文件的数量如何,开始和结束时的操作都应该只执行一次。有办法吗?在p

Primefaces 4.0有一个很好的组件来上传文件,包括一次上传多个文件。由于某种黑暗的奇迹,它实际上起了作用

代码:


问题是侦听器someBean.handleSingleFileUpload对每个文件调用一次。我很好地处理了这个问题,但在整个上传过程的开始和结束时,我看不到任何执行代码的方法。海事组织有相当大的监督

例如:

  • 开始时清除信息文本区域
  • 现在多个文件同时上传
  • 最后根据刚刚上传的数据重新加载内容

当然,无论文件的数量如何,开始和结束时的操作都应该只执行一次。有办法吗?在p:fileUpload的primefaces文档中,除了fileUploadListener之外,没有其他属性调用bean方法。

好吧,我只是简单地使用了计数器。事后看来很明显,嗯。例如:

  private int eventCounter = 0;

  public void handleSingleFileUpload(FileUploadEvent event)
  {
    beginImport();
    try
    {
      // code to import file, for example parse xml
    } catch (Exception ex)
    {
      ex.printStackTrace(); /// or whatever
    } // block catch Exception
    finally
    {
      finishImport();
    } // block finally
  }

  private synchronized void beginImport()
  {
    if (eventCounter == 0)
    {
      // insert code to execute before first file is started
    } // block if just started
    eventCounter++;
  }

  private synchronized void finishImport()
  {
    eventCounter--;
    if (eventCounter < 0) eventCounter = 0; // Just in case...
    if (eventCounter > 0) return; // not really finished yet
    // insert code to execute when last file is done
  }
private int eventCounter=0;
public void handleSingleFileUpload(FileUploadEvent事件)
{
beginImport();
尝试
{
//导入文件的代码,例如解析xml
}捕获(例外情况除外)
{
例如printStackTrace();///或其他
}//块捕获异常
最后
{
finishImport();
}//最后阻塞
}
私有同步的void beginImport()
{
if(eventCounter==0)
{
//在启动第一个文件之前插入要执行的代码
}//如果刚开始,则阻止
eventCounter++;
}
私有同步的void finishImport()
{
事件计数器--;
如果(eventCounter<0)eventCounter=0;//以防万一。。。
if(eventCounter>0)return;//尚未真正完成
//插入最后一个文件完成时要执行的代码
}
这是一个黑客式的解决方案,我担心在某些情况下,它可能会调用begin-n-finish对两次(它不应该在行中两次执行begin或finish代码),从理论上讲,这可能会干扰第n个文件的持续导入


它对我有效,至少现在是这样。将看到当xml将有数千个或更多的条目而不是十几个条目时,它是如何保持的。我更喜欢像onStartOfEverything和onEndOfEverything这样的东西作为p:fileUpload标记中的参数,但是很好。

您想显示加载条或其他东西吗???不,不,这与此无关。上传的xml格式的数据(根据它们在许多文件中的数据性质)存储在数据库中,然后我想进一步处理它们(一些转换等)。出于性能方面的原因,我不想将它们转换x次以进行x次下载,同时进行引导。我想加载所有内容,然后开始真正的工作。
  private int eventCounter = 0;

  public void handleSingleFileUpload(FileUploadEvent event)
  {
    beginImport();
    try
    {
      // code to import file, for example parse xml
    } catch (Exception ex)
    {
      ex.printStackTrace(); /// or whatever
    } // block catch Exception
    finally
    {
      finishImport();
    } // block finally
  }

  private synchronized void beginImport()
  {
    if (eventCounter == 0)
    {
      // insert code to execute before first file is started
    } // block if just started
    eventCounter++;
  }

  private synchronized void finishImport()
  {
    eventCounter--;
    if (eventCounter < 0) eventCounter = 0; // Just in case...
    if (eventCounter > 0) return; // not really finished yet
    // insert code to execute when last file is done
  }