私のアプリケーションの手順は次のとおりです。
- クライアントがチェックボックスで複数のファイルを選択し、
- リクエストはファイルの識別子で形成されます。
- クライアントは iframe 経由でアーカイブをダウンロードします: (サーバーがこれらのファイルを見つけて圧縮し、zip アーカイブのバイトを含む応答が形成されます)
iframe のコードは次のとおりです。
function makeSaveFrame(urlToServer) {
var ifrm = document.createElement("IFRAME");
ifrm.setAttribute("style", "display:none;");
ifrm.setAttribute("src", 'urlToServer';
ifrm.style.width = "0px";
ifrm.style.height = "0px";
document.body.appendChild(ifrm);
}
応答のタイプとヘッダー:
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachments; filename=\"" + fileName + ".zip\"");
問題は、何か問題が発生した場合、クライアントに理由を送信する必要があることです。私に関する限り、エラー メッセージは JSONObject 型でなければなりません。
[サーバーでエラーが発生した場合、応答のコンテンツ タイプを変更して JSONObject を送信できますが、応答をフィルタリングする方法や、iframe で応答を受信するイベントをキャッチする方法さえわかりません]
この問題に関する経験を共有してください。
アップデート
私が送れば
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "testMessage");
悪い応答応答が届きますが、makeSaveFrame() メソッドの周りの try/catch ブロックはこれをキャッチしません。
更新 私はこれを試しました
var uploadForm = document.createElement('form');
uploadForm.name = 'uploadForm';
uploadForm.setAttribute("style", "display:none;");
document.body.appendChild(uploadForm);
Ext.Ajax.request({
url: 'requestURL',
form: uploadForm.getForm().getEl(),
isUpload : true,
method: 'post',
failure : function() {
Ext.MessageBox.show({
title : 'title',
msg : 'message',
buttons : Ext.MessageBox.OK
});
}
});
ただし、isUploadパラメーターは失敗のコールバックを強制終了します。そのため、サーバーが不適切な応答応答で応答した場合、エラー ハンドラー (失敗のコールバック) は表示されません。