2010-07-29 4 views
11

पर मल्टीपार्ट/फॉर्म-डेटा अपलोड चित्र/छवि का उपयोग कैसे करें यह मेरा कोड है।एंड्रॉइड

मुझे एचटीपी 400 त्रुटि मिली, क्या कोई मेरी मदद कर सकता है?

HttpClient httpClient; 
HttpPost  httpPost; 
HttpResponse response; 
HttpContext localContext; 
FileEntity tmp = null; 
String  ret = null; 

httpClient = new DefaultHttpClient(); 
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109) ; 

httpPost = new HttpPost(url); 
tmp  = new FileEntity(data,"UTF-8"); 

httpPost.setEntity(tmp); 
httpPost.setHeader("Content-Type", "multipart/form-data"); 
httpPost.setHeader("access_token", facebook.getAccessToken()); 
httpPost.setHeader("source",  data.getAbsolutePath()); 
httpPost.setHeader("message",  "Caption for the photo"); 

localContext = new BasicHttpContext(); 
response  = httpClient.execute(httpPost,localContext); 

bobince, धन्यवाद यह मेरा नया आईडी है, मैं अपने कनेक्शन हैडर करने के लिए OAuth डाल की कोशिश करेंगे।

और यह मेरा पुराना कोड है, मैं इसे जल्द ही अपडेट कर दूंगा।

private void uploadPicture() throws ParseException, IOException { 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost("https://graph.facebook.com/me/photos"); 
    File file = new File(sdpicturePath); 

    // DEBUG 
    Log.d("TSET", "FILE::" + file.exists()); // IT IS NOT NULL 
    Log.d("TEST", "AT:" + fbAccessToken); // I GOT SOME ACCESS TOKEN 

    MultipartEntity mpEntity = new MultipartEntity(); 
    ContentBody cbFile  = new FileBody(file, "image/png"); 
    ContentBody cbMessage  = new StringBody("TEST TSET"); 
    ContentBody cbAccessToken = new StringBody(fbAccessToken); 

    mpEntity.addPart("access_token", cbAccessToken); 
    mpEntity.addPart("source",  cbFile  ); 
    mpEntity.addPart("message",  cbMessage );   

    httppost.setEntity(mpEntity); 

    // DEBUG 
    System.out.println("executing request " + httppost.getRequestLine()); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity resEntity = response.getEntity(); 

    // DEBUG 
    System.out.println(response.getStatusLine()); 
    if (resEntity != null) { 
     System.out.println(EntityUtils.toString(resEntity)); 
    } // end if 

    if (resEntity != null) { 
     resEntity.consumeContent(); 
    } // end if 

    httpclient.getConnectionManager().shutdown(); 
} // end of uploadPicture() 
+0

कुछ शरीर मुझे मदद करता है .... – Joseph

+0

हाय, आप कैसे इस समस्या को हल किया? मुझे अब एक ही समस्या का सामना करना पड़ रहा है। –

उत्तर

8

setEntity पूरे अनुरोध शरीर का स्रोत सेट है, इसलिए यदि data फ़ाइल पहले से इनकोडिंग multipart/form-data ब्लॉक था यह केवल काम करेगा।

एक पोस्ट अनुरोध निकाय के रूप में उपयोग के लिए multipart/form-data -कोडेड फॉर्म सबमिशन बनाने के लिए, आपको एक MIME मल्टीपार्ट एन्कोडर की आवश्यकता होगी, आमतौर पर org.apache.http.entity.mime.MultipartEntity। दुर्भाग्यवश, यह एंड्रॉइड द्वारा बंडल नहीं किया गया है, इसलिए यदि आप इसे चाहते हैं तो आपको अपाचे से एक नया HttpClient खींचना होगा।

उदाहरण के लिए this question देखें और पृष्ठभूमि के लिए this thread देखें।

+0

बहुत बहुत धन्यवाद, मैं अब कोशिश कर रहा हूँ।^___^ – Joseph

+0

कूल !! लेकिन अब मुझे इससे त्रुटि मिली है ... >> {"error": {"type": "OAuthException", "message": "अवैध OAuth पहुंच टोकन।"}} – Joseph

+1

ओएथ एक एप्लिकेशन-स्तरीय समस्या है, कुछ भी नहीं फ़ाइल अपलोड या फॉर्म निर्माण के साथ करने के लिए। ऐसा लगता है कि आपको उपयोगकर्ता को एक्सेस अधिकृत करने के अनुरोध के साथ ['oauth_' शीर्षलेख] (http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-igning-requests/) पास करने की आवश्यकता है डेटा। – bobince

3

वहाँ, पोस्ट के साथ छवि भेजने Apache HTTP लाइब्रेरी का उपयोग कर के लिए मेरे कार्य हल है:

  ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); 
      byte[] imageBytes = baos.toByteArray(); 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP); 

      String boundary = "-------------" + System.currentTimeMillis(); 

      httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary); 

      ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png"); 
      StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN); 
      StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN); 

      HttpEntity entity = MultipartEntityBuilder.create() 
        .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
        .setBoundary(boundary) 
        .addPart("group", sbGroup) 
        .addPart("owner", sbOwner) 
        .addPart("image", bab) 
        .build(); 

      httpPost.setEntity(entity); 

      try { 
       HttpResponse response = httpclient.execute(httpPost); 
       ...then reading response 
1
फेसबुक ग्राफ एपीआई के लिए के रूप में

, इस कोड को सही काम करता है। हालांकि, कभी कभी, आप नाम बजाय फ़ाइल नाम उपयोग करने के लिए, की जरूरत ग्राफ एपीआई आरएफसी दस्तावेज़ के साथ संघर्ष करने लगता है।

final String BOUNDERY = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f"; 
final String CRLF = "\r\n"; 
StringBuilder sbBody_1 = new StringBuilder(); 
sbBody_1.append("--" + BOUNDERY + CRLF); 
sbBody_1.append("Content-Disposition: form-data; filename=\"source\"" + CRLF); 
sbBody_1.append(CRLF); 
StringBuilder sbBody_2 = new StringBuilder(); 
sbBody_2.append(CRLF + "--" + BOUNDERY + "--"); 
URL url = new URL("https://graph.facebook.com/me/photos?access_token=" + accessToken); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setDoOutput(true); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDERY); 
connection.setChunkedStreamingMode(0); 
OutputStream out = new BufferedOutputStream(connection.getOutputStream()); 
out.write(sbBody_1.toString().getBytes()); 
out.write(bFile);// bFile is byte array of the bitmap 
out.write(sbBody_2.toString().getBytes()); 
out.close(); 
BufferedReader bips = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
String temp = null; 
while ((temp = bips.readLine()) != null) { 
    Log.d("fbnb", temp); 
} 
bips.close(); 
connection.disconnect();