0

私はJavaソケットプログラミングを使用して単純なサーバーを作成し、ダウンロード用に2つのファイルを提供し、ダウンロードが終了したときにHTML応答を表示することを目的としていました。私が行ったことは、PrintWriter.printまたはDataOutPutStream.writeBytesを使用してhtmlタグと応答文字列を含む文字列をブラウザーに送信し、次にOutputStream.writeを使用して要求されたファイルを送信することです。ブラウザに入力したURLは127.0.0.1/test1.zipのようで、関連するコードフラグメントは次のとおりです。

pout.print("<html>");
pout.print("<head>");
pout.print("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1/\">");
pout.print("<title>Response</title>");
pout.print("</head>");
pout.print("<body>");
pout.print(createResponseHeader(200, fileTypeCode));
pout.print("</body>");
pout.print("</html>");
pout.print(createResponseHeader(200, fileTypeCode));
pout.flush();

byte[] buffer = new byte[client.getSendBufferSize()];
int bytesRead = 0;
System.out.println("Sending...");
while((bytesRead = requestedFile.read(buffer))>-1)
{
    out.write(buffer,0,bytesRead);
}

poutはPrintWriterであり、outはOutputStreamです。問題は、127.0.0.1 / test2.zipを使用してファイルをダウンロードしようとすると、ダウンロードできず、代わりに、応答文字列と多くの意味のない文字をブラウザーに出力することです。

HTTP / 1.0 200 OK

接続:閉じる

サーバー:COMP5116割り当てサーバーv0

コンテンツタイプ:application / x-zip-compressed

PK ‹â:Lmá^ЛàÍtest2.wmvì[y <”Ûÿ?3ÃØ—Ab¸eeË'5K"»±f_B*ÃÅ*YÛ•¥M5h±¯u[(\・(-÷F)ß3ÏÉ½ÝºÝ ×ýýñ{Íg^ÏûyžóYÏçœçyÎç¼P'>™îÝ+½Žö6A€;;ýmüH»êt©k]R#*€.G‰µÅRÏøÍLÔóZ;´£åÑvP¹æª@õó”æÇ„ ‹&amp; ïÍš]Ð4iIJ0Àª3]B€ðÀ¸CôÁ`äè1ü½¤Ã¬$pBi

zipファイルを文字列として応答ヘッダーとともに表示するだけだと思います。ファイルを送信するコードの前にPrintWriterを使用すると、出力ストリーム全体がバイトではなく文字列の送信に使用されるようです。ただし、応答を送信するコードの一部をファイルを送信するコードの後に​​置くと、ダウンロードは正常に機能しますが、応答メッセージがブラウザに出力されず、空白のページだけが出力されます。

4

1 に答える 1

0

ここからHTMLコードを削除し、バイナリデータのみを送信する必要があります。それらを単一のサーブレットに混在させることはできません。

あなたがやりたいことを達成することは簡単ではありません。

ページ内のJavaScriptコードを使用してダウンロードを開始すると、ページはAjaxを使用してサーバー側サーブレットをポーリングし、その特定のセッションでダウンロードが完了したかどうかを認識します。実際、JavaScriptにはダウンロード完了イベントはありません。

この情報を取得するために、ダウンロードサーブレットは、ダウンロードが完了したときにフラグでセッションを更新します。

ダウンロードが完了したことをAjax呼び出しが返すと、ページ内のテキストを変更するか、新しいページにリダイレクトできます。

編集:または、要件を変更できる場合は、ダウンロードの直前に表示する必要のあるすべてのメッセージを表示し、ダウンロードリンクにtarget = "_ blank"を入力して、クリックしてページが失われないようにする方がはるかに簡単です。リンク。

于 2011-05-03T18:45:42.623 に答える