我正在制作一个将图像文件传输到客户端的Web服务。对于客户端,我使用Apache HttpClient
API,因为我在开始在android上编码之前测试服务。
正如你所看到的那样,一半(左右)的像素在传输过程中丢失了,但我不知道是不是因为一些转移窃贼或我正在解析错误的答案(可能是后者)。我正在使用SAX进行解析,它以XML格式接收InputStream
。
XML格式如下:
<Image>
<data>some Base64 encoded bytes</data>
<name>image name</name>
</Image>
以下是Web服务客户端代码:
private static void download() {
try {
System.out.println("Downloading file...");
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(SERVICE_URL + "download/me");
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() != 200) {
System.out.println("Error: HTTP error code: "
+ response.getStatusLine().getStatusCode());
}
InputStream xml = response.getEntity().getContent();
Image i = parseDownload(xml);
System.out.println(i);
client.getConnectionManager().shutdown();
FileOutputStream fos = new FileOutputStream(
new File("D:/newMe.jpg"));
fos.write(i.getData());
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
这是我的解析代码:
private static Image parseDownload(InputStream xml) {
final Image i = new Image();
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
private boolean name = false;
private boolean data = false;
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
if (qName.equals("name"))
name = true;
if (qName.equals("data"))
data = true;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (name) {
i.setName(new String(ch, start, length));
name = false;
}
if (data) {
String data = new String(ch, start, length);
i.setData(Base64.decodeBase64(data));
this.data = false;
}
}
};
Reader reader = new InputStreamReader(xml);
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");
parser.parse(is, handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return i;
}
知道我做错了什么?
答案 0 :(得分:3)
是的,您将在本网站及其他许多网站上一次又一次地看到此答案:characters()
方法调用无法保证在1方法调用中为您提供所有元素的内容。 必须将所有字符方法调用聚合到一个缓冲区中,并且只有在获得endElement()
方法调用时才处理它们。