在浏览器中显示字节数组中的图像

时间:2013-02-10 21:56:09

标签: java image serversocket

我有一个简单的TCP serversocket,它将获取一个字节数组。此GET来自此服务器上的网站,其中包含指向gif图像的img src链接,请求如下所示:

GET /myHome.htm HTTP/1.1
GET /house.gif HTTP/1.1

现在字节数组完成如下:

byte[] fileByte = Files.readAllBytes(filePath);

要打印包含此图像的网站,请执行以下操作:

out.writeBytes(new String(fileByte));

出:

DataOutputStream out= new DataOutputStream(socketClient.getOutputStream());

现在要进行图像显示,我想我必须使用其他的东西

out.writeBytes()

但我不确定。有谁知道如何显示图像?现在图像根本就没有显示出来。

1 个答案:

答案 0 :(得分:2)

首先,确保您的GIF文件没有损坏。 (之前也发生在我身上)。

如果是这种情况,请尝试使用此代码发送GIF文件:

byte[] fileByte = Files.readAllBytes(filePath);
writer.writeBytes("HTTP/1.1 200 OK\r\n");
writer.writeBytes("Content-Type: image/gif\r\n");
writer.writeBytes("Content-Length: "+fileByte.length+"\r\n");
writer.writeBytes("\r\n");
writer.write(fileByte, 0, fileByte.length);

然后尝试直接导航到“house.gif”而不是“myHome.htm”。请在评论中告诉我这是做什么的。

以前的回答尝试:

我想我可能误解了你的问题。让我尝试一个不同的答案:

您不确定如何在服务器上找出何时返回HTML文件myHome.htm以及何时返回house.gif?

我认为您需要简单地解析所请求的URL。只需检查它是否包含“house.gif”。然后,根据这个,您可以返回上面描述的HTML文件,或者发送.gif文件,确保使用

writer.write(fileByte, 0, fileByte.length);

发送二进制数据,并设置回复标头

Content-Type: image/gif

但是,在这两种情况下(对于HTML文件和GIF文件),您应该使用正确的HTTP响应标头预先添加要发送的数据。不要以错误的方式使用网页标题,但此网站可能有所帮助:http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/

只是为了确保:您的服务器将收到两个独立请求。第一个将要求HTML文件,第二个将要求GIF文件。所以你发送一个或另一个。因此,没有“特殊方式”来发送GIF而不是HTML文件。您使用相同的clientSocket。但这是一种不同的联系。

上一个回答:

我认为您可能错过了返回数据的mime类型。尝试在回复中添加以下HTTP标头:

Content-Type: image/gif

实际上......您是否正在发送正确的HTTP回复(包括标题,特别是内容长度)?如果没有,请给我发一个评论,我会发布你需要的代码。

如果出于某种原因,您无法设置内容类型标头以让浏览器知道您正在向其发送图像,那么您可以将具有XMLHttpRequest的客户端上的二进制数据加载到JavaScript函数中而不是将其指定为img标记的源Url。然后,您可以使用JavaScript将二进制数据编码为具有正确mime类型的dataURI(http://en.wikipedia.org/wiki/Data_URI_scheme),并将其设置为图像的源。

实际上,我刚刚在您的代码中发现了一些内容:

new String(fileByte)

可能会将fileBytes解释为unicode字符而不是二进制字符。然后,当您将其写入编写器时,它可能会将其搞砸,因为图像中的所有数据可能都不是有效的unicode。尝试用以下代码替换该行:

writer.write(fileByte, 0, fileByte.length);

也许这就是你需要做的一切来修复它?