Android httpclient Datei laden Daten Korruption und Timeout Probleme

Ich habe Probleme mit dem Hochladen von Bildern in Android.

Ich bin mit apache httpmime 4.1 lib der Code ist wie folgt:

  • Token-Authentifizierung mit Volleyball
  • FIPS-Konformität für mein Android-Projekt
  • Unterschiede und Vorteile von SurfaceView vs GLSurfaceView auf Android?
  • Wie bekomme ich Android Market Daten, wenn es keine API gibt?
  • Android mit maven? Apk unbekannt
  • BitmapFactory.decodeFile gibt kein Nullbild aus
  • MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileName()), "image/jpeg")); resp = NetworkUtils.sendHttpRequestMultipart(EXPORT_PHOTOS_URI, reqEntity); 

    NetworkUtils Klasse:

     public class NetworkUtils { public static final int REGISTRATION_TIMEOUT = 3 * 1000; public static final int WAIT_TIMEOUT = 5 * 1000; public static HttpResponse sendHttpRequestMultipart(String uri, MultipartEntity entity) { HttpClient mHttpClient = new DefaultHttpClient(); final HttpParams params = mHttpClient.getParams(); HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT); HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT); ConnManagerParams.setTimeout(params, WAIT_TIMEOUT); HttpPost post = new HttpPost(uri); post.addHeader(entity.getContentType()); post.setEntity(entity); HttpResponse resp = mHttpClient.execute(post); } } 

    Manchmal geht alles gut, aber manchmal (vor allem bei einer langsamen Verbindung) wird das Bild sehr korruptiert hochgeladen. Das Beispiel ist hier: http://pixelbirthcloud.com/574_orig.jpg

    Es werfen keine Ausnahmen aus. Die Länge der hochgeladenen Datei ist die gleiche wie die ursprüngliche .. versucht, Mime-Typ auf Anwendung / octet-Stream ändern oder entfernen Sie es überhaupt. Versucht, mit Timeouts zu spielen. Noch gleiches Ergebnis. Endbenutzer laden korrupte Bilder fast die ganze Zeit (obwohl ich es geschafft habe, bronem Bilder nur noch 2 mal zu bekommen) .. die Bildgröße war 2,5 Megs auf den ersten, aber dann habe ich es auf 500-700 kb reduziert. Hat das Problem aber nicht beendet

    Ich habe nicht versucht, die Apache-Bibliothek zu wechseln .. Vielleicht ist es das Problem .. aber soweit ich das Netz gelesen habe, hat niemand das mit der httpmime-Bibliothek erlebt.

    Was kann es sein? Ich bin jetzt völlig verloren ๐Ÿ™

    Das andere Problem ist, dass Timeouts manchmal nicht funktioniert.

    Wie wenn es um diese Zeile geht: HttpResponse resp = mHttpClient.execute (post); Und ich deaktiviere 3g-Verbindung es wartet nur für 17-20 Minuten statt 3 oder 5 Sekunden .. und nur dann werft Ausnahme. Versucht verschiedene Methoden. so was:

      HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); HttpProtocolParams.setUseExpectContinue(params, false); HttpConnectionParams.setConnectionTimeout(params, 10000); HttpConnectionParams.setSoTimeout(params, 10000); ConnManagerParams.setMaxTotalConnections(params, 5); ConnManagerParams.setTimeout(params, 30000); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80)); ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry); HttpClient httpclient = new DefaultHttpClient(manager, params); 

    Aber immer noch nicht funktioniert ๐Ÿ™‚

  • Überprüfen Sie, ob das Gerät eingesteckt ist
  • Wie kann ich LogCat / Console in Eclipse für Android aktivieren?
  • FloatingActionButton mit SnackBar und CoordinatorLayout wird nicht mit Proguard arbeiten
  • Jquerymobile's Tap-Hold funktioniert nicht im Opern-Mobile-Widget-Emulator
  • Keytool mit Android Facebook SDK
  • Wie bekomme ichTopActivity Name oder bekomm den aktuellen laufenden Anwendungspaketnamen in lollipop?
  • 3 Solutions collect form web for “Android httpclient Datei laden Daten Korruption und Timeout Probleme”

    Siehe mein Code von Image Uploader und es hat gut für mich gearbeitet Diese Klasse Hochladen einer Datei auf den Server und am Ende lesen Sie die XML-Antwort auch. Filtern Sie den Code wie pro Ihre Anforderung .. Es funktionierte ziemlich glatt für mich

     package com.classifieds; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import android.util.Log; public class Uploader { private String Tag = "UPLOADER"; private String urlString ;//= "YOUR_ONLINE_PHP"; HttpURLConnection conn; String exsistingFileName ; private void uploadImageData(String existingFileName , String urlString) { String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; try { // ------------------ CLIENT REQUEST Log.e(Tag, "Inside second Method"); FileInputStream fileInputStream = new FileInputStream(new File( exsistingFileName)); // open a URL connection to the Servlet URL url = new URL(urlString); // Open a HTTP connection to the URL conn = (HttpURLConnection) url.openConnection(); // Allow Inputs conn.setDoInput(true); // Allow Outputs conn.setDoOutput(true); // Don't use a cached copy. conn.setUseCaches(false); // Use a post method. conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos .writeBytes("Content-Disposition: post-data; name=uploadedfile;filename=" + exsistingFileName + "" + lineEnd); dos.writeBytes(lineEnd); Log.v(Tag, "Headers are written"); // create a buffer of maximum size int bytesAvailable = fileInputStream.available(); int maxBufferSize = 1000; // int bufferSize = Math.min(bytesAvailable, maxBufferSize); byte[] buffer = new byte[bytesAvailable]; // read file and write it into form... int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable); while (bytesRead > 0) { dos.write(buffer, 0, bytesAvailable); bytesAvailable = fileInputStream.available(); bytesAvailable = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bytesAvailable); } // send multipart form data necesssary after file data... dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // close streams Log.v(Tag, "File is written"); fileInputStream.close(); dos.flush(); dos.close(); } catch (MalformedURLException ex) { Log.e(Tag, "error: " + ex.getMessage(), ex); } catch (IOException ioe) { Log.e(Tag, "error: " + ioe.getMessage(), ioe); } SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = null; try { sp = spf.newSAXParser(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Get the XMLReader of the SAXParser we created. XMLReader xr = null; try { xr = sp.getXMLReader(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Create a new ContentHandler and apply it to the XML-Reader MyExampleHandler1 myExampleHandler = new MyExampleHandler1(); xr.setContentHandler(myExampleHandler); // Parse the xml-data from our URL. try { xr.parse(new InputSource(conn.getInputStream())); //xr.parse(new InputSource(new java.io.FileInputStream(new java.io.File("login.xml")))); } catch (MalformedURLException e) { Log.d("Net Disconnected", "NetDisconeeted"); // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { Log.d("Net Disconnected", "NetDisconeeted"); // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { Log.d("Net Disconnected", "NetDisconeeted"); // TODO Auto-generated catch block e.printStackTrace(); } // Parsing has finished. } public Uploader(String existingFileName, boolean isImageUploading , String urlString ) { this.exsistingFileName = existingFileName; this.urlString = urlString; } class MyExampleHandler1 extends DefaultHandler { // =========================================================== // Methods // =========================================================== @Override public void startDocument() throws SAXException { } @Override public void endDocument() throws SAXException { // Nothing to do } @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { } /** Gets be called on closing tags like: * </tag> */ @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { } /** Gets be called on the following structure: * <tag>characters</tag> */ @Override public void characters(char ch[], int start, int length) { } } } 

    Ich hatte das gleiche Korruptionsproblem auf 80% meiner hochgeladenen Dateien. Emulator hat es nicht geschafft, Beschädigte Dateien waren 1k größer, dass Original. Dann setze ich den Puffer des Ausgabestroms auf 1 Byte und es fing an, ohne Probleme zu arbeiten. Schließlich ließ ich es 8 Bytes und hatte keine Korruptionsprobleme mehr. Ein Puffer von etwa 80 oder 50, kann ich mich nicht erinnern, auch gescheitert. Versteh nicht was das Problem ist, aber ich bin froh, dass es so funktioniert. Diese Seite war so inspirierend danke.

    OK. Verbrachte 2 Tage bei der Prüfung dieses Problems und fand heraus folgendes:
    Bei der Verwendung von tcpdump auf Android kommt es, dass die Daten nicht korrupt waren, aber die tcp-Paketgröße war 1516, was sehr seltsam ist, weil die normale Ethernet-Paketgröße 1500 ist und alles mehr als 1516 viel zu groß ist.
    Ich habe manuell die MTU auf 576 (ich glaube, es ist der Standard für ppp, was 3G tatsächlich ist) und es funktioniert perfekt! 150 von 150 Bildern wurden normal hochgeladen!

    Dies löst nicht das eigentliche Problem, aber es ist unmöglich, mtu auf nicht verwurzelten Geräten zu ändern, glaube ich, und du musst es jedes Mal ändern, wenn du das Gerät neu startet (oder jedes Mal, wenn du die Schnittstelle bringst – nicht sicher Es konnte nicht den Weg finden, den MTU-Wert über ifconfig zu erhalten). Aber zumindest weiß ich wo das problem ist
    Einstellung HTTP-Chunk-Größe auf einen kleineren Wert (versucht 300 Bytes) nicht beeinflussen (ich glaube, es ist, weil die HTTP-Header sind viel zu groß selbst) … so … so nichts =)

    Wird versuchen, es auf Android-Entwickler-Gruppe auf Google zu veröffentlichen, aber ihre Moderation ist viel zu langsam … wir werden sehen …

    Das Android ist ein Google Android Fan-Website, Alles รผber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.