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