Я делаю веб-сервис, который передает файл изображения клиенту.Для клиента я использую API Apache HttpClient
, потому что я тестирую сервисы перед тем, как начать кодировать на Android.
Как видите, половина(или около того) пикселей теряются при передаче, но я не знаю, если это из-за некоторых воров передачи или я разбираю ответ неправильно (возможно, последний).Я использую SAX для анализа, он получает InputStream
в форме XML.
Формат XML выглядит следующим образом:
<Image>
<data>some Base64 encoded bytes</data>
<name>image name</name>
</Image>
Вот код клиента веб-службы:
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;
}
Есть идеи, что я делаю неправильно?