2012-05-11 11 views
6

Quindi sto cercando di scaricare e caricare un oggetto da un file memorizzato su un server web. Il codice che uso è all'interno di un blocco try-catch in un AsyncTask:Android: Scarica oggetto

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(); 

costruisco il file con questo codice:

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

Quando provo e leggere l'oggetto nella prima parte di codice Ricevo un IOExecption che il formato dati UTF non corrisponde a UTF-8. Ho provato a ricostruire il file un paio di volte e mi dà sempre lo stesso errore. Posso scaricare un oggetto come questo?

+0

Qual è il codice sul lato server? Come si genera 'thefileIwant'? – kichik

+0

È appena ospitato tramite http ed è completamente accessibile al pubblico. Ho appena aggiunto il codice che uso per creare il file. – Flynn

+0

Suoni come se il tuo server stia inviando il tipo di contenuto sbagliato. Assicurati che sia 'application/octet-stream'. – kichik

risposta

1

Questo sembra un problema di codifica. Penso che kichik abbia ragione e molto probabilmente il tuo server sta inviando dati usando il tipo di contenuto sbagliato, ma penso che dovrai impostarlo su application/x-java-serialized-object. Prova ad aggiungere le seguenti righe subito dopo l'apertura della URLConnection:

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

Se questo non dovesse funzionare (il server potrebbe non essere in grado di inviare utilizzando quel tipo) è possibile provare a utilizzare Socket al posto della URLConnection, oppure serializza il tuo oggetto usando XML o JSON e ottalo tramite HttpUrlConnection

0

Prova questo. È simile al tuo codice ma con un paio di differenze. La lettura/scrittura sequenziale potrebbe essere un po 'antiquata ma funziona bene per me.

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

questo funziona per noi, Usare alcune librerie 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(); 
    }