2011-02-04 16 views
10

मुझे एंड्रॉइड में छवियों को अपलोड करने में समस्याएं आ रही हैं।एंड्रॉइड httpclient फ़ाइल अपलोड डेटा भ्रष्टाचार और टाइमआउट मुद्दे

मैं अपाचे httpmime 4.1 का उपयोग कर रहा कोड lib इस तरह है:

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 वर्ग:

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

कभी कभी सब कुछ ठीक काम करता है, लेकिन कभी कभी (विशेष रूप से धीमे कनेक्शन पर) छवि बहुत दूषित अपलोड की गई है। उदाहरण यहां है: http://pixelbirthcloud.com/574_orig.jpg

यह कोई अपवाद नहीं फेंकता है। अपलोड की गई फ़ाइल की लंबाई मूल के समान ही है .. माइम प्रकार को एप्लिकेशन/ऑक्टेट-स्ट्रीम में बदलने या इसे हटाने की कोशिश की गई। टाइमआउट के साथ खेलना कोशिश करता है। अभी भी एक ही परिणाम। अंतिम उपयोगकर्ता भ्रष्ट छवियों को लगभग हर समय अपलोड करते हैं (हालांकि मैं केवल ब्रोनम छवियों को केवल 2 बार प्राप्त करने में कामयाब रहा हूं) .. छवि का आकार पहले 2.5 मेग्स था, लेकिन फिर मैंने इसे 500-700 केबी तक घटा दिया। हालांकि समस्या को ठीक नहीं किया।

ने अपाचे की लाइब्रेरी को बदलने की कोशिश नहीं की है .. शायद यह समस्या है .. लेकिन जहां तक ​​मैंने नेट पढ़ा, कोई भी httpmime लाइब्रेरी के साथ इसका अनुभव नहीं कर रहा था।

यह क्या हो सकता है? मैं पूरी तरह से जब यह इस लाइन के लिए आता है की तरह अब खो रहा हूँ :(

अन्य मुद्दा है कि समय समाप्ति कभी कभी काम नहीं कर रहा

:। HttpResponse resp = mHttpClient.execute (पोस्ट); और मैं 3g को निष्क्रिय कनेक्शन यह सिर्फ तरह के लिए के बजाय 17-20 मिनट 3 या 5 सेकंड इंतजार कर रहा है .. और उसके बाद ही अपवाद फेंकता विभिन्न तरीकों की कोशिश की इस तरह:।।

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

लेकिन अभी भी काम नहीं करता है :)

उत्तर

7

देखो मेरा छवि अपलोडर कोड और यह मेरे लिए बहुत अच्छा काम करता है यह कक्षा सर्वर पर एक फ़ाइल अपलोड करती है और अंत में एक्सएमएल उत्तर भी पढ़ती है। फ़िल्टर अपने आवश्यकता के अनुसार कोड .. इसके लिए मुझे


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) { 

    } 
    } 

} 
+0

आपके द्वारा मारा जाने वाला ऑनलाइन स्क्रिप्ट फ़ाइल को पढ़ने और डेटाबेस पर सहेजने के लिए कोड होना चाहिए – Javanator

+0

ऐसा कुछ ऐसा करने का अंत हो सकता है जो मुझे लगता है ... हालांकि इसने सवाल का जवाब नहीं दिया, लेकिन धन्यवाद .. इस तरह के समाधान को देखा नेट पर पहले, लेकिन एक और सुविधाजनक तरीका जाने का फैसला किया - httpcomponents का उपयोग कर .. लेकिन किसी कारण से असफल रहा :( – Alex

+0

यह एक पूर्ण वर्ग है जिसे हमें केवल फाइल यूआरएल और स्क्रिप्ट के यूआरएल को पास करने की आवश्यकता है। फिर और अधिक सुविधाजनक क्या होगा यह – Javanator

1

ठीक सुंदर चिकनी काम किया। इस समस्या का परीक्षण करने में 2 दिन बिताए और निम्नलिखित पाया:
एंड्रॉइड पर टीसीपीडम्प का उपयोग करते समय यह आता है कि डेटा दूषित नहीं था, लेकिन टीसीपी पैकेट आकार 1516 था, जो बहुत अजीब है, क्योंकि सामान्य ईथरनेट पैकेट आकार 1500 है और 1516 से अधिक कुछ भी रास्ता बहुत बड़ा है।
मैंने मैन्युअल रूप से एमटीयू को 576 में बदल दिया (मुझे विश्वास है कि यह पीपीपी के लिए मानक है, जो वास्तव में 3 जी है) और यह सही काम करता है! 150 में से 150 छवियों को सामान्य रूप से अपलोड किया गया था!

यह वास्तविक समस्या का समाधान नहीं करता है, हालांकि, मुझे लगता है कि गैर-रूट डिवाइस पर एमटीयू को बदलना असंभव है, और जब भी आप डिवाइस को रीबूट करते हैं तो आपको इसे बदलना होगा (या जब भी आप इंटरफ़ेस लाते हैं - इसके बारे में निश्चित नहीं है, कारण ifconfig के माध्यम से एमटीयू मूल्य प्राप्त करने का तरीका नहीं मिला)। लेकिन कम से कम मुझे पता है कि समस्या कहां है।
एक छोटे से मूल्य (300 बाइट्स की कोशिश की) के लिए http खंड आकार को प्रभावित नहीं किया (मुझे विश्वास है क्योंकि ऐसा इसलिए है क्योंकि http शीर्षलेख स्वयं बहुत बड़े हैं) ... इसलिए ...तो कुछ भी नहीं है =)

+0

हाय एलेक्स, मुझे लगता है कि मुझे आपके जैसा ही समस्या आ रही है लेकिन मैंने आपके जैसे टीसीपीडम्प के साथ सत्यापित नहीं किया है। मैं httpclient का उपयोग कर रहा हूं और मैंने जो किया है, वह क्लाइंट भेजने वाले डेटा पर चेकसम सेट कर रहा है, सर्वर की ओर से चेकसम इस अवसर का अनुभव करने वाले मौकों पर गलत है। मेरे मामले में अपलोड किया गया डेटा बस फ़ाइल के हिस्सों को याद कर रहा है। अन्य बार सब कुछ पूरी तरह से काम करता है। मैंने एंड्रॉइड डेवलपर्स पर अपना धागा देखा लेकिन ऐसा लगता है कि आपको कोई समाधान नहीं मिला। रिपोर्ट करने के लिए कुछ भी नया (ओह कृपया!) – dweebo

+0

यदि आप फ़ाइल के कुछ हिस्सों को खो रहे हैं, तो यह एक और समस्या है। यदि आप मध्यस्थ का उपयोग करते हैं, तो आपको गलत फ़ाइल लंबाई के साथ froyo बग में देखना चाहिए।कारण है कि सर्वर पर फ़ाइल की लंबाई अलग है, लेकिन यह अभी भी फ़ाइल प्राप्त करती है, इसका मतलब है कि सामग्री-लंबाई गलत है, अन्यथा यह अलग-अलग फ़ाइल लंबाई के कारण अपलोड को अस्वीकार कर देगा ... – Alex

+0

धन्यवाद Alex, हम सत्यापित किया है कि ऐप द्वारा बनाए गए डेटा सही हैं, लेकिन सर्वर पर हमें प्राप्त संस्करण गलत है। फ़ाइल का आकार अलग है। हम mediastore का उपयोग नहीं कर रहे हैं, इसलिए फ़ाइल आकार froyo बग हमारी समस्या नहीं है, यह कुछ और है। सत्यापित किया गया है कि यह केवल एंड्रॉइड 2.2+ के साथ होता है, लेकिन फोन और वाहकों की एक श्रृंखला पर और यह हमारे सैकड़ों उपयोगकर्ताओं के साथ हो रहा है – dweebo

4

मैं 80 पर एक ही भ्रष्टाचार की समस्या थी Google Play पर Android निर्माता समूह पर पोस्ट करने की कोशिश करेंगे, लेकिन उनके संयम रास्ता बहुत धीमी गति से ... हम देखेंगे है ... मेरी अपलोड की गई फाइलों का%। हालांकि एमुलेटर अपलोड करने में असफल रहा। दूषित फाइलें 1k बड़ी थीं जो मूल हैं। फिर मैंने आउटपुट स्ट्रीम के बफर को 1 बाइट पर सेट किया और यह बिना किसी समस्या के काम करना शुरू कर दिया। आखिर में मैंने इसे 8 बाइट्स होने दिया और भ्रष्टाचार की कोई समस्या नहीं थी। लगभग 80 या 50 का बफर, मुझे याद नहीं है, असफल भी। समझ में नहीं आता कि समस्या क्या है लेकिन मुझे खुशी है कि यह इस तरह से काम कर रहा है। यह पृष्ठ बहुत प्रेरक धन्यवाद था।

संबंधित मुद्दे