2011-05-03 79 views
0

我用java socket編程,寫了一個簡單的服務器,並旨在使該提供的2個文件下載和顯示一些HTML響應時,下載完了。我所做的是使用PrintWriter.print或DataOutPutStream.writeBytes將包含html標記和響應字符串的字符串發送到瀏覽器,然後使用OutputStream.write發送請求的文件。我在瀏覽器中輸入網址的就像127.0.0.1/test1.zip,相關的代碼片段如下:問題發生時使用的OutputStream和(或DataOutputStream類的PrintWriter)

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); 
} 

的撅着嘴是一個PrintWriter,而出來的OutputStream中。 問題是當我嘗試使用127.0.0.1/test2.zip下載文件時,它不讓我下載,而是在瀏覽器中打印出響應字符串和很多無意義字符,例如,

HTTP/1.0 200 OK

連接:關閉

服務器:COMP5116分配服務器V0

內容類型:應用程序/ x-ZIP壓縮

PK AItest2.wmvì[Y <「UY 3AO-Ab¸eeË'5K?「»±f_B * A A *玉•¥M5H±U [(\·( - ÷F)ß3ÏɽݺÝ×YYN { IG ^ÏûyžóYÏçœçyÎç¼P'>™IY +½Žö6A€;; YMU H»ET©k]的R·*€.G‰μÅRÏøÍLÔóZ;'£åÑvP¹æª@ OO」 AEC「<&‡ëî9q‰U>LkÇÈyÖ2qãÌÆ(ãDŸã©IIS]Ð4iIJ0Àª3]乙€ðÀ¸CôÁ`äè1ü½¤Ã¬$ pBi

我相信它只是顯示壓縮文件作爲字符串與響應頭一起。看起來在發送文件的代碼之前使用PrintWriter之後,整個輸出流用於發送字符串而不是字節。但是,如果我在發送文件的代碼之後放置了發送響應的代碼部分,則下載工作正常,但瀏覽器中沒有任何響應消息打印出來,只是一個空白頁面。

回答

0

您已經從這裏刪除您的HTML代碼,只發送二進制數據。你不能將它們混合在一個servlet中。

達到你想要做的是不容易的。

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

要獲得這些信息完成下載時,下載的servlet將與標誌更新會話。

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

編輯:另外,如果你可以改變你的要求,這將是容易得多,說明你剛纔下載之前顯示的所有消息,並把目標=「_空白」的下載鏈接,讓你的網頁點擊鏈接不會丟失。

+0

謝謝您的回覆,但我不想讓它變得如此複雜,只有POJO就夠了,但無論如何,再次感謝您的回覆。 – user736644 2011-05-03 22:39:05

+0

是的,我認爲這會很複雜。基本的是,你不能用一個servlet來做你想要的,因爲你不能混合html和二進制數據。 – stivlo 2011-05-04 02:11:00