Primefaces 4.0有很好的组件来上传文件,包括一次多个文件。通过一些黑暗的奇迹,它确实有效。
代码:
<p:fileUpload fileUploadListener="#{someBean.handleSingleFileUpload}"
mode="advanced" multiple="true" auto="true" dragDropSupport="true"
update=":form_info" sizeLimit="100000" allowTypes="/(\.|\/)(xml)$/" />
问题是每个文件都会调用一次侦听someBean.handleSingleFileUpload。我处理得很好,但是在整个上传过程的开始和结束时我都看不到任何执行某些代码的方法。国际海事组织相当大的疏忽。
例如:
当然,无论文件数量多少,开始和结束的事情都应该只执行一次。有没有办法做到这一点?在p:fileUpload的primefaces docs中,没有其他属性调用bean方法而不是fileUploadListener。
答案 0 :(得分:0)
好吧,我最后只是使用了计数器。后见之明,呃。例如:
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
}
这是hackish解决方案,我担心在某些情况下它可以调用begin-n-finish对两次(它不应该在行中开始或完成代码两次)并且理论上可能会干扰正在进行的第n个文件的导入
它对我有用,至少目前如此。当xml将有数千个或更多的条目而不是十几个时,将会看到它是如何保持的。我更喜欢像onStartOfEverything和onEndOfEverything这样的东西作为p:fileUpload标签中的参数,但是很好。