繁体   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