2011-05-03 27 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

相关问题