2011-11-26 41 views
2

我正在制作一个Web服务,将图像文件传输到客户端。对于客户端,我使用Apache HttpClient API,因为我在开始在android上编码之前正在测试服务。奇怪的JAX-RS行为

Image Sent Image Recieved

正如你可以看到,有一半(左右)的显示像素都失去了转移,但我不知道这是否是因为一些转移盗贼或者我解析答案错误(可能是后者)。我使用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; 
    } 

的任何想法我做错了?

回答

3

是的,你将再次看到本网站和许多其他这样的回答时间和时间:该characters()方法调用不能保证给你一个元素的所有内容1个方法调用。您必须必须将所有字符方法调用聚集到一个缓冲区中,并且只有在获取endElement()方法调用时才会处理它们。

+0

谢谢,就是这样... –