我有一个非常愚蠢的页面,它使用Java作为服务器。该页面当前允许用户上传excel文件,服务器通过它解析。
现在的诀窍是,当文件中存在错误(无效的数据类型等)时,我正在重新创建一个excel文件,突出显示错误行并将其返回给浏览器。
如果错误大于一行(例如,如果他们上传非excel文件),我会将它们重定向到“您的不良”页面。
问题是,我希望在上传和处理文件时为用户提供一个简单的加载微调器。我已经尝试了几个jQuery插件,但是当返回文件时,javascript没有捕获任何内容。 chrome调试器的网络选项卡显示POST被“取消”。我认为这是因为我的服务器没有返回重定向,它返回一个文档:
if (hasErrors) {
log.debug("Errors were found, returning workbook");
try {
response.setHeader("Content-disposition", "attachment; filename=errorBook.xlsx");
ServletOutputStream outputStream = response.getOutputStream();
errorBook.write(outputStream);
outputStream.flush();
return null;
} catch (Exception e) {
log.error("Unable to write to the output stream", e);
}
}
log.debug("No errors found in workbook upload");
return "redirect:/uploadfiles/" + encodeUrlPathSegment(uf.getId().toString(), httpServletRequest);
我正在使用SpringRoo作为我的服务器端,它使用的是瓷砖等。当我返回文件时,请注意“返回null”。我无法返回任何内容,因为它抱怨输出流已经被写入。
还有其他人有这样的问题吗?这是一个奇怪的情况吗?有没有办法让javascript抓住“服务器已取消表单帖子”?
编辑:这是我现在使用的jQuery。自我最初发布以来,情况发生了变化,但问题仍然存在。我现在正在使用fileupload插件,并发现当我强制使用iFrame时,文件会下载,但不会调用done / fail / always回调函数。$("#uploadFile").fileupload({
forceIframeTransport : true
})
.bind("fileuploadsubmit", function(e, data) {
console.log("submitting");
})
.bind("fileuploaddone", function(e, data) {
console.log("success!");
})
.bind("fileuploadfail", function(e, data) {
console.log("Fail");
})
.bind("fileuploadalways", function(e, data) {
console.log("always");
});
如果我删除强制iframe,则会触发回调,但不会下载文档。实际上,在这种情况下,数据包含一个文件对象的字符串(只是一小部分字节)。