Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

response.getOutputStream.write()の後のrequest.getParameter()が失敗します。

検索サイトでは対処法がなかなか出てこないので質問させて頂きます。

サーブレットのJSP画面でファイルを
アップロードしてサーバ側でコンバートをかけた後、
response.getOutputStream.write()を使って
クライアントにコンバート後の
ファイルをダウンロードさせました。
(正常終了時はRequestDispatcher.forwardはしない)

getOutputStream.writeを使った場合、
理由はまだ分かりませんがファイルアップロード前の
画面がそのまま表示されているので
そこからリクエストを投げて
操作を続行したいという希望があるのですが
ファイルのダウンロード後はダウンロード前は
成功していた場所のrequest.getParameter()が
どうしてもnullを返すようになってしまいます。

例外が起きている訳ではないので
スタックトレースはないです。

以下はサーバ側のgetOutputStream.write周辺のソースです。
--------------------------------
        try {
            // ZIPファイルの作成
            common.createZip(zipFile, targetFiles);

//            // ファイル名のエンコード
            zipFileName = common.encodeFileName(zipFileName);

//            // ZIPファイルのダウンロード
            response.setContentType("application/octet-stream; charset=\"Windows-31J\"");
            response.setHeader("Content-Disposition", "attachment; filename=\"" + zipFileName + "\"");

            out = response.getOutputStream();
            in = new FileInputStream(zipFile);
            int c;
            // このループが終わるとクライアント画面にダウンロード保存画面が出る。
            while ((c = in.read()) != -1) {
                out.write(c);
            }
            dataDownLoadedFlg = "1";
            out.close();

        } catch (IOException e) {

        } finally {

            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }

            if (in != null) {
                try {
                    in.close();
                    in = null;
                } catch (IOException e) {
                }
            }
        }
--------------------------------
失敗するgetParameterは以下のとおりで特に変わったところはないと思います。
----------------------------------
            //メニュー番号取得
            String menuNo = request.getParameter("menuNo");

--------------------------------
またJSP側に設置しているリクエスト送信は以下のようにしてあります。
------------------------------
    function doConbertCsv(){
        //メニュー項目選択によって呼ばれる。
         jQuery("#XXXProduct").attr("action","XXXXWorkUnit");
         jQuery("#menuNo").val('90');
         jQuery("#XXXProduct").submit();
    }
----------------------------
当方でも調査続行しておりますが
response.getOutputStream.write()の実行が
契機になって問題が発生しているというところまでしか
原因の切り分けができておりません。

解決法や原因をご存じの方がいらっしゃいましたら
情報提供をお願いしたく思います。

3

回答

86578

閲覧

3件の回答

評価

0

補足で環境について追記します。
現象はエクリプス上でも起きます。
(エクリプス上のtomcatはデフォルト設定です)

エクリプスのバージョンは
Eclipse Java EE IDE for Web Developers.(3.7 Indigo)
tomcatはエクリプスからバージョン7.xに設定しています。
コンパイラーの準拠レベルは1.5です。

評価

0

自己解決しました。

最初にファイルをアップロードする際に
以下のコードを実行していたのですが

-------------------------
function doConvertCsv(){
    
    alert(jQuery("#XXXProduct").attr("enctype"));
    
    jQuery("#XXXProduct").attr("action","XXXXXXXConvertCsv");
    jQuery("#XXXProduct").attr("enctype","multipart/form-data");
    jQuery("#funcCd").val('10');
    jQuery("#XXXProduct").submit();
}

----------------------------------

ファイルアップロードの際に
jQuery("#XXXProduct").attr("enctype","multipart/form-data");
を実行していたので
他の通常のリクエストを投げる際には
jQuery("#XXXProduct").attr("enctype","application/x-www-form-urlencoded");
を前もって実行してenctypeを元に戻すようにしたら解決しました。

上記の修正を加える以前は
response.getOutputStream.write()を実行するか否かで
現象の「発生する、しない」が別れましたが
私の知らないところで何かしらの関係があって
そうなったのだと思われます。

技術的な詳細は分かりませんが解決したのでよしとします。
読んで下さった方、ありがとうございました。




評価

0

そもそもレスポンスを書き出した後にリクエストを取る意味
が分からん。
とくにpostの場合、パラメータはクライアントと接続してる
間だけ取れて、一回走査したらおしまいなんだし。

ちゃんとurlencodeで二つ目のリクエストを発行すれば、サー
バー側で二度目が走って、うまく行くのは当然だと思うが。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。