使用OutputStream&时出现问题(DataOutPutStream或PrintWriter)

时间:2011-05-03 18:01:44

标签: java html sockets outputstream 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 OK

     

连接:关闭

     

服务器:COMP5116 Assignment Server v0

     

Content-Type:application / x-zip-compressed

     

PK <â:Lmá^Ð>àÍtest2.wmvì[y&lt;“Ûÿ?3ÃØ-Ab¸eeË'5K”»±f_B *Ã*YÛ•¥M5h±¯u[(\·( - ÷ F)ß3ÏɽݺÝ×ýý{Íg^ÏûyžóYÏçœçyÎç¼P'&gt;™îÝ+½Ž6A€;;ýmüH»êt©k] R#*€.G‰μÅRÏøÍLÔóZ;'£åÑvPææª@õó“æÇ”<&amp;‡ëî9q‰> LkÇÈyÖ2qãÌÆ(ãDŸã©ïÍš)Ð4iIJ0Àª3] B€ÀÀCôÁ`äè1ü½¤Ã¬$ pBi

我相信它只是将zip文件显示为字符串,并且响应头一起显示。一旦在发送文件的代码之前使用PrintWriter,整个输出流用于发送字符串而不是字节。但是,如果我把发送文件代码后发送响应的部分代码放在一起,下载工作正常,但浏览器中没有打印出任何响应消息,只是一个空白页面。

1 个答案:

答案 0 :(得分:0)

您必须从此处删除HTML代码并仅发送二进制数据。您不能将它们混合在一个servlet中。

要实现你想做的事并不容易。

我将在页面中使用一些JavaScript代码开始下载,然后页面将使用Ajax轮询服务器端servlet,该servlet将知道该特定会话的下载是否已完成。事实上,JavaScript中没有下载完成的事件。

要获得此信息,下载servlet将在下载完成后使用标志更新会话。

当您的Ajax调用将返回下载完成后,您可以更改页面中的文本或重定向到新页面。

修改:或者,如果您可以更改要求,则可以更轻松地显示您在下载之前必须显示的所有消息,并在下载中放置target =“_ blank”链接,以便点击链接不会丢失您的页面。