0

我有一个非常愚蠢的页面,它使用 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,它使用瓷砖等。当我返回一个文件时,请注意“return 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");
    });

如果我删除了 force iframe,则会触发回调,但不会下载文档。实际上,在这种情况下,数据包含文件对象的字符串(只是一小部分字节)。

4

0 回答 0