2010-08-14 11 views
10

को नहीं भेजता है यह पता लगाने की कोशिश कर रहा है कि मेरे कोडिंग में क्या गलत है। मैंने here से एक ब्लॉग पोस्ट का पालन किया।एंड्रॉइड मल्टीपार्ट HTTP पोस्ट फ़ाइल के एमआईएमई प्रकार

मैं वास्तव में फ़ाइल को एक PHP वेब सेवा में अपलोड करने में कामयाब रहा। हालांकि, किसी कारण से मैंने फ़ाइल के लिए स्पष्ट रूप से MIME प्रकार सेट किया है, PHP दिखाता है कि MIME केवल एक खाली स्ट्रिंग है और इसलिए अस्वीकार कर दिया गया है।

public String SendPost(String fn, String bid, String caption, String uid, String APIKey, String postHash) 
     throws ParseException, ClientProtocolException, IOException { 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost(UrbURL); 

    Log.i("POSTFN", fn); 
    Log.i("POSTFN", bid); 
    Log.i("POSTFN", caption); 
    Log.i("POSTFN", uid); 
    Log.i("POSTFN", APIKey); 
    Log.i("POSTFN", postHash); 

    String postAuth = uid + postHash; 
    postAuth = md5(postAuth); 
    postAuth = postAuth.substring(0, 16); 
    //Log.i("POSTAUTH", postAuth); 

    MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

    /*File tempImg = new File(fn); 
    FileBody bin = new FileBody(tempImg, "image/jpg");*/ 
    mp.addPart("business_photo", new FileBody(new File(fn), "image/jpg")); 

    //StringBody s = new StringBody(bid, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("business_id", new StringBody(bid, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(caption, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("photo_caption", new StringBody(caption, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(uid, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("user_id", new StringBody(uid, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(APIKey, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("apikey", new StringBody(APIKey, "text/plain", Charset.forName("UTF-8"))); 

    //s = new StringBody(postAuth, "text/plain", Charset.forName("UTF-8")); 
    mp.addPart("auth", new StringBody(postAuth, "text/plain", Charset.forName("UTF-8"))); 

    httppost.setEntity(mp); 

    String response = EntityUtils.toString(httpclient.execute(httppost).getEntity(), "UTF-8"); 

    httpclient.getConnectionManager().shutdown(); 

    return response; 
} 

बहुत धन्यवाद :)

+0

हाय क्या आप कृपया मुझे बता सकते हैं कि 'अक्षरसेट' क्या है और मैं इसे किस पर सेट करता हूं – SAndroidD

उत्तर

5

इससे पहले कि मैं एक ही समस्या थी और बस तय:

यहाँ मेरी codings है।

मैंने पाया कि HttpMultipartMode.BROWSER_COMPATIBLE का उपयोग करके एक छवि के लिए ByteArrayBody का उपयोग करते समय सही माइम टाइप को मेरे अनुरोध में सेट करने से रोका गया। मुझे लगता है कि यह शायद आपके पास एक ही समस्या है।

जब मैं इस लाइन बदल:

MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

MultipartEntity mp = new MultipartEntity(); 

तो माइम प्रकार सही ढंग से स्थापित किया गया था और सेवा अपलोड काम करने के लिए।

मुझे लगता है कि लोगों ने एक और समस्या को हल करने के लिए BROWSER_COMPATIBLE का उपयोग किया था, लेकिन उम्मीद है कि आपको इसकी आवश्यकता नहीं है।

+0

इससे मेरी मदद मिली। आपका बहुत बहुत धन्यवाद! – pixelscreen

1

हमारे यहां एक ही समस्या है। HttpMultipartMode.BROWSER_COMPATIBLE का उपयोग करके सही माइमटाइप भेजा जा रहा है।

दुर्भाग्यवश 'सामान्य' MultipartEntity() का उपयोग करना हमारे लिए एक विकल्प नहीं है, इस प्रकार रेल बैकएंड अनुरोध हैंडलिंग को गड़बड़ कर देता है।

क्या मल्टीपार्ट के सामग्री-प्रकार को सेट करने और HttpMultipartMode.BROWSER_COMPATIBLE का उपयोग करने का कोई तरीका है ??

1

मुझे 3 फाइलबॉडी और 1 माइम जानकारी पोस्ट करने के लिए थोड़ी देर के लिए एक ही समस्या थी, जब तक कि मैंने केवल एक फ़ाइल नहीं भेजा, तब तक माइम (जेसन में) कभी प्राप्त नहीं हुआ था। मैं हमेशा फाइलबॉडी को पहले जोड़ता हूं जिसने मुझे समस्या का कारण बना दिया। मैंने बहुत शुरुआत में माइमेट माइम द्वारा ऑर्डर को उलट दिया और माइम समेत हर जानकारी को PHP सर्वर अंत में सही तरीके से प्राप्त किया गया।

1

जार फ़ाइलों को शामिल करने के बजाय आप एंड्रॉइड में परिभाषित http मल्टीपार्ट कक्षाओं का उपयोग कर सकते हैं लेकिन आंतरिक के रूप में घोषित कर सकते हैं, इसलिए आप उन्हें सीधे उपयोग नहीं कर सकते हैं, आपको उन्हें android source code से डाउनलोड करना होगा और उन्हें अपनी परियोजना में जोड़ना होगा। कुछ मूलभूत संशोधनों का उपयोग करने से पहले किया जाना चाहिए, कुछ भी मुश्किल नहीं है (पैकेज नाम बदलें, सभी लॉगर कॉल हटाएं)। यह मेरे लिए पूरी तरह से काम करता है। मुझे उम्मीद है कि यह किसी की मदद कर सकता है,

+0

लिंक टूटा हुआ है। – Zammbi

1

तो सभी उपरोक्त उत्तरों ने इसे सही करने में मदद की।

लेकिन HttpMultipartMode.BROWSER_COMPATIBLE को हटाकर इसे हल नहीं किया जाएगा।

आप इस

ByteArrayBody bab = new ByteArrayBody(params.getByteArray("data"), "image/jpeg" , "image.jpg"); 

N.B. करके माइम प्रकार सेट कर सकते हैं मैं नवीनतम रीपैक्ड एंड्रॉइड क्लाइंट http://code.google.com/p/httpclientandroidlib/ का उपयोग कर रहा हूं जो मल्टीपार्ट अपलोड आदि का समर्थन करता है।

+0

ग्रेट .... धन्यवाद। वास्तव में मेरा समय बचाओ। –

2

संस्करण 4.1 से संस्करण 4.4 तक HttpClient को अपडेट करते समय मुझे एक ही समस्या थी। न तो HttpMultipartMode.BROWSER_COMPATIBLE हटा रहा है और न ही अन्य वैकल्पिक विकल्पों के साथ प्रतिस्थापित करने में मदद मिली है।

एक समाधान है कि आवश्यकता है मेरे लिए कम से कम परिवर्तन जब एक FileBody निर्माण, यानी

new FileBody(file, mimeType) 

जगह

new FileBody(file, filename, mimeType, charset) 

साथ संस्करण HttpClient 4.4 के लिए, कारण हो सकता है के रूप में स्पष्ट रूप से filename निर्दिष्ट करने के लिए है new FileBody(file, mimeType) का उपयोग करने के बजाय filename फ़ील्ड में null असाइन करें। फिर, formatMultipartHeader को HttpMultipart में निष्पादित करते समय, filename स्वरूपित होने वाले भाग के BROWSER_COMPATIBLE मोड में शून्य नहीं है, तो चेक किया गया है। अगर शून्य, तो पूरे शरीर को नजरअंदाज कर दिया जाता है।

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