[英]rich:fileUpload in JSF version 3.3.3 final, 1 file uploaded causes file upload listener to run twice in Firefox v69
出于某种原因,最好的猜测是浏览器如何处理 ajax 事件,单个文件上传两次触发 Java 中的事件侦听器。
这个问题在 Firefox 中最为严重。
最新的 Chrome 版本和旧的 Firefox v28(2014) 一般工作。
目标是上传和处理单个文件: - 将其限制为单个文件上传 - 检查上传的文件是否为有效的 XML - 将上传的文件保存在新生成的名称的另一个位置 - 删除临时文件
Richfaces 文件上传端:
<a4j:form id="formFileUpload">
<h:panelGrid id="fileUploadSection" columns="1" width="100%">
<!-- ##### File uploader ##### -->
<!-- https://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/rich_fileUpload.html -->
<rich:spacer width="10px" height="0px" />
<h:outputText value="Upload file candidate:" />
<rich:fileUpload fileUploadListener="#{attributeConfigurationMgr.validateFileUploadListener}"
addControlLabel="Select File..."
id="upload"
immediateUpload="true"
allowFlash="false"
noDuplicate="true"
listHeight="55px"
onupload="console.log('fileupload onupload:'+Date.now())"
oncomplete="console.log('fileupload complete:'+Date.now())"
>
<a4j:support event="onuploadcomplete" ajaxSingle="true" reRender="validatePanel, validationFilesTable, fileUploadSection" />
</rich:fileUpload>
</h:panelGrid>
</a4j:form>
Java 侧事件侦听器:
当生成 2 个事件时,我试图确定是否未处理相同的临时上传文件以避免双重处理,似乎临时上传文件并不总是完全存在。
他们是一种检测文件上传标头大小的方法吗? 然后我可以检查临时文件的大小是否正确?
private String lastUploadedFile = null;
public synchronized void validateFileUploadListener(final UploadEvent event) {
UploadItem item = event.getUploadItem();
File uploadedFile = item.getFile();
String uploadedFileName = item.getFileName();
if (lastUploadedFile != null && lastUploadedFile.contentEquals(uploadedFileName))
{
// check doesn't it have the same file upload name
firstEvent = false;
}
else
{
// set name as hopefully first upload event
lastUploadedFile = uploadedFileName;
firstEvent = true;
}
if(Files.exists(uploadedFile.toPath())) {
// find XSD file to validate against
// validate against xsd
// save file
// temp file delete
}
}
我不太了解 RF 3 的内部工作原理,但是:
如果这是浏览器相关我假设表单被提交两次。 如果是这种情况,您应该能够拦截它。 FileUpload.upload
是一个公共方法,一般的表单提交方法似乎是_JSFFormSubmit
。 您可以覆盖这些方法之一,并提供您区分重复项取消执行。
如果您无法在客户端检测到事物,您可以通过实现javax.servlet.Filter
(与 RichFaces 相同,使用org.ajax4jsf.webapp.BaseFilter
)来拦截服务器请求。 这样您就可以访问请求标头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.