我有一台服务器通过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
有什么事情在这里跳出来是不正确的吗?注意我在使用原始图像数据时是不是在进行任何类型的字符编码?
答案 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);