簡體   English   中英

使用 OutputStream & (DataOutPutStream 或 PrintWriter) 時出現問題

[英]Problem occured when using OutputStream & (DataOutPutStream or PrintWriter)

我使用 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 正常

連接:關閉

服務器: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¹æª@õõó”æÇ„‹&‡ëî9q‰Ú>LkÇÈyÖ2qãÌÆ(ãDŸã ]Ð4iIJ0Àª3]B€ðÀ¸CôÁ`ä è1ü½¤Ã¬$ pBi

我相信它只是將 zip 文件與響應 header 一起顯示為字符串。 似乎一旦在發送文件的代碼之前使用了 PrintWriter,整個 output stream 用於發送字符串而不是字節。 但是,如果我將發送響應的代碼部分放在發送文件的代碼之后,下載工作正常,但瀏覽器中沒有打印出任何響應消息,只是一個空白頁。

您必須從此處刪除 HTML 代碼並僅發送二進制數據。 您不能將它們混合在一個 servlet 中。

實現自己想做的事情並不容易。

我將在頁面中使用一些 JavaScript 代碼開始下載,然后頁面將使用 Ajax 輪詢服務器端 servlet,該 servlet 將知道該特定 Z21D6F40CFB511982E4424E0E250A59 的下載是否完成。 實際上在 JavaScript 中沒有下載完成事件。

要獲得此信息,下載 servlet 將在下載完成時使用標志更新 session。

當您的 Ajax 調用將返回下載完成時,您可以更改頁面中的文本或重定向到新頁面。

編輯:或者,如果您可以更改您的要求,那么在下載之前顯示您必須顯示的所有消息會更容易,並將 target="_blank" 放在下載鏈接中,這樣您的頁面就不會因為單擊而丟失鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM