2012-05-11 6 views
6

Also versuche ich ein Objekt aus einer Datei, die auf einem Webserver gespeichert ist, herunterzuladen und zu laden. Der Code ich benutze, ist in einem Try-Catch-Block in einem AsyncTask:Android: Download Objekt

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

baue ich die Datei mit diesem Code:

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

Wenn ich versuche, und das Objekt im ersten Teil des Codes lesen Ich bekomme eine IOException, dass das UTF-Datenformat nicht mit UTF-8 übereinstimmt. Ich habe versucht, die Datei ein paar Mal neu zu erstellen und es gibt mir immer den gleichen Fehler. Kann ich ein Objekt wie dieses herunterladen?

+0

Was auf der Server-Seite der Code ist? Wie generierst du 'thefileIwant'? – kichik

+0

Es ist nur über http gehostet und ist vollständig öffentlich zugänglich. Ich habe gerade den Code hinzugefügt ich benutze die Datei – Flynn

+0

Sounds wie Ihr Server sendet den falschen Inhaltstyp. Stellen Sie sicher, dass es "application/octet-stream" ist. – kichik

Antwort

1

Das sieht wie ein Codierungsproblem aus. Ich denke, Kichik hat recht und wahrscheinlich sendet Ihr Server Daten mit dem falschen Inhaltstyp, aber ich denke, Sie müssen ihn stattdessen auf application/x-java-serialized-object setzen. Probieren Sie die folgenden Zeilen hinzufügen direkt nach dem URLConnection Eröffnung:

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

Wenn das nicht funktioniert (der Server nicht in der Lage sein, es zu gesendet, diese Art verwenden) können Sie entweder versuchen, Sockel zu verwenden, anstatt URLConnection, Oder serialisieren Sie Ihr Objekt mit XML oder JSON und holen Sie es über HttpUrlConnection

0

Versuchen Sie dies. Es ist ähnlich wie Ihr Code, aber mit ein paar Unterschieden. Das sequentielle Lesen/Schreiben mag etwas antiquiert sein, funktioniert aber gut für mich.

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

Dies funktioniert für uns, einige Apache Bibliotheken

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