2012-05-11 26 views
6

Por lo tanto, estoy tratando de descargar y cargar un objeto desde un archivo almacenado en un servidor web. El código que uso es dentro de un bloque try-catch en un AsyncTask:Android: Descargar el objeto

URL url = new URL("http://www.mydomain.com/thefileIwant"); 
URLConnection urlConn = url.openConnection(); 
ObjectInputStream ois = new ObjectInputStream(urlConn.getInputStream()); 
foo = (Foo) ois.readObject(); 
ois.close(); 

construyo el archivo con el código:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("thefileIwant")); 
oos.writeObject(foo); 
oos.close(); 

Cuando intento y leí el objeto en la primera pieza de código Recibo un IOExecption que el formato de datos UTF no coincide con UTF-8. He intentado reconstruir el archivo un par de veces y siempre me da el mismo error. ¿Puedo descargar un Objeto así?

+0

Cuál es el código del lado del servidor? ¿Cómo se genera 'thefileIwant'? – kichik

+0

Se acaba de alojar a través de http y es completamente accesible públicamente. Acabo de agregar el código que uso make the file – Flynn

+0

Parece que su servidor está enviando el tipo de contenido incorrecto. Asegúrate de que sea 'application/octet-stream'. – kichik

Respuesta

1

Parece un problema de codificación. Creo que kichik tiene razón y lo más probable es que su servidor esté enviando datos usando el tipo de contenido incorrecto, pero creo que tendrá que configurarlo en application/x-java-serialized-object. Trate de añadir las siguientes líneas justo después de la apertura de la URLConnection:

urlConn.setUseCaches(false); 
urlConn.setRequestProperty("Content-Type", "application/x-java-serialized-object"); 

Si eso no funciona (el servidor puede no ser capaz de enviado usando ese tipo) o bien se puede tratar de usar socket en vez de URLConnection, o serialice su objeto usando XML o JSON y obtenga eso a través de HttpUrlConnection

0

Pruebe esto. Es similar a tu código pero con un par de diferencias. La lectura/escritura secuencial puede ser un poco anticuada, pero funciona bien para mí.

URL url = new URL("your URL"); 
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
    urlConn.setRequestMethod("GET"); 
    urlConn.setRequestProperty("Content-Type", "text/plain; charset=utf-8"); 
    urlConn.connect(); 
    InputStream is = urlConn.getInputStream(); 
    byte[] buffer = new byte[1024]; 
    int numRead = 0; 
    FileOutputStream fos = new FileOutputStream("Your File"); 
    while ((numRead = is.read(buffer)) > 0) { 
    fos.write(buffer, 0, numRead); 
    } 
    fos.close(); 
0

Esto funciona para nosotros, pero aplicando algunas bibliotecas Apache

 FileOutputStream fos = new FileOutputStream("Your File"); 
     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 
     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

     HttpClient client = new DefaultHttpClient(ccm, params); 


     HttpGet httpGet = new HttpGet(downloadURL); 
     try { 
     HttpResponse response = client.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 
     Log.d(LOG_TAG, "code is " + statusCode); 
     if (statusCode == 200) { 
      HttpEntity entity = response.getEntity(); 
      InputStream content = entity.getContent(); 

      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      while ((len1 = content.read(buffer)) > 0) { 
       fos.write(buffer,0, len1); 
     }        

     success = true; 
     } else { 
      Log.e(LOG_TAG_JSON, "Failed to download file " + downloadURL); 
     } 
     if (null != response.getEntity()) 
     { 
      response.getEntity().consumeContent(); 
     } 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.e(LOG_TAG, "downloadVersion " + e.toString()); 
     e.printStackTrace(); 
    } 
Cuestiones relacionadas