通过HTTP接收二进制数据

时间:2016-11-21 20:08:34

标签: java http post png

我有一台服务器通过HTTP post请求向客户端发送.png图像。 .png存储在sqlite3数据库中,作为blob检索,这一切都正常;我已经测试了将返回的blob保存到磁盘,它可以按预期打开。当我的客户端解释响应时,有效负载的长度从16365到16367神秘地增长,检查响应字符串已经显示有一些额外的'?'流中间歇性的字符

使用适用于Chrome的ARC插件测试服务器已显示收到的响应长度合适,这让我相信我的客户端代码存在问题:

// request
URL url = new URL(targetURL);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", Integer.toString(parameters.getBytes().length));
conn.setRequestProperty("Content-Language", "en-US");
conn.setUseCaches(false);
conn.setDoOutput(true);
conn.getOutputStream().write(parameters.getBytes());

// response
Reader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
for (int c; (c = rd.read()) >=0;)
    sb.append((char)c);
String response = sb.toString();
// this String is of length 16367 when it should be 16365

有什么事情在这里跳出来是不正确的吗?注意我在使用原始图像数据时是不是在进行任何类型的字符编码?

1 个答案:

答案 0 :(得分:0)

您可以使用DataInputStream来读取字节流。

URL url = new URL("http://i.stack.imgur.com/ILTQq.png");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

DataInputStream dis = new DataInputStream(conn.getInputStream());

FileOutputStream fw = new FileOutputStream(new File("/tmp/img.png"));

byte buffer[] = new byte[1024];

int offset = 0;
int bytes;
while ((bytes = dis.read(buffer, offset, buffer.length)) > 0) {
    fw.write(buffer, 0, bytes);
}
fw.close();

或者,可以使用ImageIO.read(java.net.URL)直接从BufferedImage创建URL的实例。

URL url = new URL("http://i.stack.imgur.com/ILTQq.png");
BufferedImage image = ImageIO.read(url);