2014-04-22 7 views
5

मैं अपाचे एचटीपी कॉम्पोनेंट्स v4.3.3 (मेवेन httpclient और httpmime) का उपयोग कर रहा हूं। मुझे कुछ मेटाडेटा के साथ एक फाइल अपलोड करने की जरूरत है। कर्ल कमांड, जो काम करता है, निम्न जैसा दिखता है।अपाचे HttpComponentst का उपयोग करके मैं मल्टीपार्ट/मिश्रित http अनुरोध कैसे बना और पोस्ट करूं?

कर्ल -k मैं एच "सामग्री प्रकार: बहुखण्डीय/मिश्रित" -X पोस्ट --form 'फ़ील्ड 1 = VAL1' --form 'field2 = val2' --form 'फ़ाइल = @ somefile। ज़िप; प्रकार = एप्लिकेशन/ज़िप 'https://www.some.domain/

मैंने इस कर्ल पद को निम्नलिखित के रूप में नकल करने का प्रयास किया है।

HttpEntity entity = MultiPartEntityBuilder 
.create() 
.addPart("field1",new StringBody("val1",ContentType.TEXT_PLAIN)) 
.addPart("field2",new StringBody("val2",ContentType.TEXT_PLAIN)) 
.addPart("file", new FileBody(new File("somefile.zip"), ContentType.create("application/zip")) 
.build(); 
HttpPost post = new HttpPost("https://www.some.domain"); 
post.addHeader("Content-Type", "multipart/mixed"); 

हालांकि, के बाद मैं HttpClient का उपयोग HttpPost निष्पादित करने के लिए, मैं निम्नलिखित अपवाद (सर्वर कोड भी है जावा घाट पर चल रहा है) मिलता है।

org.apache.commons.fileupload.FileUploadException: अनुरोध को अस्वीकार कर दिया गया था क्योंकि बहुखण्डीय सीमा

मिला था जब मैं कर्ल करने के लिए

कर्ल निशान जोड़ने - ट्रेस - -के -आई-एच "सामग्री-प्रकार: मल्टीपार्ट/मिश्रित" -एक्स पोस्ट --form 'field1 = val1' --form 'field2 = val2' --form '[email protected]; type = application/ज़िप 'https://www.some.domain/

मुझे लगता है कि फॉर्म फ़ील्ड/मान जोड़े HTTP शीर्षलेख के रूप में सेट हैं।

सामग्री-विस्थापन: फॉर्म-डेटा; नाम = फ़ील्ड 1 ... मूल्य 1

मैं यहां क्या गलत कर रहा हूं पर कोई विचार है? किसी भी मदद की सराहना की है।

उत्तर

7

मैंने थोड़ी सी बात की और कोड काम करने के लिए दो चीजें कीं।

  • नहीं रह गया है addPart (...)
  • नहीं रह गया है सेट सामग्री प्रकार शीर्ष लेख का उपयोग

यहाँ संशोधित स्निपेट है, जो मामले में काम कर रहा है किसी को भी रुचि है।

HttpEntity entity = MultipartEntityBuilder 
.create() 
.addTextBody("field1","val1") 
.addTextBody("field2","val2") 
.addBinaryBody("file", new File("somefile.zip"),ContentType.create("application/zip"),"somefile.zip") 
.build(); 
HttpPost post = new HttpPost("https://www.some.domain"); 
post.setEntity(entity); 

मैंने एचटीपी कॉम्पोनेंट्स को डिबग मोड में भी सेट किया है।

 
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog 
-Dorg.apache.commons.logging.simplelog.showdatetime=true 
-Dorg.apache.commons.logging.simplelog.log.org.apache.http=DEBUG 

यह पता चला है कि प्रत्येक भाग में अब सीमा है। अभी तक बेहतर, सामग्री-प्रकार और सीमा स्वत: उत्पन्न हो गई है।

सामग्री-प्रकार: मल्टीपार्ट/फॉर्म-डेटा; सीमा = 5ejxpaJqXwk2n_3IVZagQ1U0_J_X9MdGvst9n2Tc

+0

पता नहीं क्यों आपको कोई वोट नहीं मिला - यह एंड्रॉइड पर मल्टीपार्ट का समाधान है! मुझे मिली अन्य चीजें इसे मैन्युअल रूप से करती हैं जो काफी बोझिल है .... – Lonzak

+0

लेकिन यह मल्टीपार्ट/मिश्रित नहीं है। मल्टीपार्ट/फॉर्म-डेटा के साथ ऐसा करने के लिए सैकड़ों उत्तर होने लगते हैं। – unwichtich

1

यहाँ मेरा पूरा कोड पिछले जवाब में आधारित है, लेकिन थोड़ा अलग, मैं एक ही त्रुटि थी जाता है, लेकिन अब काम करता है (धन्यवाद जेन!):

public String sendMyFile(String p_file, String p_dni, String p_born_date) throws Exception { 

    HttpClient httpclient = HttpClientBuilder.create().build(); 

    HttpPost httppost = new HttpPost("http://localhost:2389/TESTME_WITH_NETCAT"); 

    /* Campos del formulario del POST que queremos hacer */ 
    File  fileIN = new File(p_file); 

    /* Construimos la llamada */ 
    MultipartEntityBuilder reqEntity = MultipartEntityBuilder.create(); 

    reqEntity 
      .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) 
      .addBinaryBody ("p_file"    , fileIN) 
      .addTextBody ("p_dni"    , p_dni) 
      .addTextBody ("p_born_date" , p_born_date); 

    httppost.setEntity(reqEntity.build()); 

    System.out.println("executing request " + httppost.getRequestLine()); 

    HttpResponse response = httpclient.execute(httppost); 

    System.out.println("1 ----------------------------------------"); 
    System.out.println(response.getStatusLine()); 
    System.out.println("2 ----------------------------------------"); 
    System.out.println(EntityUtils.toString(response.getEntity())); 
    System.out.println("3 ----------------------------------------"); 

    HttpEntity resEntity = response.getEntity(); 

    if (resEntity != null) { 
     System.out.println("Response content length: " + resEntity.getContentLength()); 
    } 

    return "OK"; 
} 
+1

स्टैक ओवरफ़्लो में आपका स्वागत है! हालांकि यह कोड स्निपेट प्रश्न हल कर सकता है, [एक स्पष्टीकरण सहित] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के प्रश्नों का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। – gunr2171

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