6 Stimmen

Android: Objekt herunterladen

Ich versuche also, ein Objekt aus einer auf einem Webserver gespeicherten Datei herunterzuladen und zu laden. Der Code, den ich verwende, befindet sich innerhalb eines try-catch-Blocks in einer AsyncTask:

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

Ich erstelle die Datei mit diesem Code:

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

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

1voto

THelper Punkte 14895

Das sieht nach einem Kodierungsproblem aus. Ich denke, kichik hat Recht und höchstwahrscheinlich sendet Ihr Server Daten mit dem falschen Inhaltstyp, aber ich denke, Sie müssen ihn auf application/x-java-serialized-object stattdessen. Versuchen Sie, die folgenden Zeilen direkt nach dem Öffnen der URLConnection hinzuzufügen:

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

Wenn das nicht funktioniert (Ihr Server ist möglicherweise nicht in der Lage, es mit diesem Typ zu senden), können Sie entweder versuchen, Socket anstelle von UrlConnection zu verwenden, oder Ihr Objekt mit XML oder JSON serialisieren und das über HttpUrlConnection abrufen

0voto

dda Punkte 5750

Versuchen Sie dies. Es ist ähnlich wie Ihr Code, aber mit ein paar Unterschieden. Die sequentielle Lesen/Schreiben kann ein wenig antiquiert sein, aber funktioniert 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();

0voto

Kibi Punkte 1722

Das funktioniert bei uns, wenn wir einige Apache-Bibliotheken verwenden

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X