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");
    });

強制 iframe を削除すると、コールバックは発生しますが、ドキュメントはダウンロードされません。実際、この場合、データにはファイル オブジェクトの文字列が含まれています (これはほんのわずかなバイトです)。

4

0 に答える 0