2009-09-04 27 views
78

अपाचे कॉमन्स एचटीपी क्लाइंट के संस्करण 3.x के दिनों में, एक मल्टीपार्ट/फॉर्म-डेटा पोस्ट अनुरोध संभव था (an example from 2004)। दुर्भाग्यवश यह version 4.0 of HttpClient में अब संभव नहीं है।जावा का उपयोग करके मैं एक मल्टीपार्ट/फॉर्म-डेटा पोस्ट अनुरोध कैसे कर सकता हूं?

हमारी मूल गतिविधि "HTTP" के लिए, मल्टीपार्ट कुछ हद तक दायरे से बाहर है। हम अन्य प्रोजेक्ट द्वारा बनाए गए मल्टीपार्ट कोड का उपयोग करना पसंद करेंगे जिसके लिए यह गुंजाइश है, लेकिन मुझे किसी के बारे में पता नहीं है। हमने मल्टीपार्ट कोड को कॉमन्स-कोडेक को कुछ वर्षों पहले स्थानांतरित करने का प्रयास किया, लेकिन मैंने वहां नहीं लिया। ओलेग ने हाल ही में एक और प्रोजेक्ट का उल्लेख किया है जिसमें मल्टीपार्ट पार्सिंग कोड है और हमारे मल्टीपार्ट स्वरूपण कोड में रुचि हो सकती है। मुझे उस स्थिति की वर्तमान स्थिति नहीं पता है। (http://www.nabble.com/multipart-form-data-in-4.0-td14224819.html)

किसी को भी किसी भी जावा पुस्तकालय है कि मुझे एक HTTP ग्राहक कि एक बहुखण्डीय/फार्म-डेटा पोस्ट अनुरोध कर सकते हैं लिखने के लिए अनुमति देता है के बारे में पता है?

पृष्ठभूमि: मैं Remote API of Zoho Writer का उपयोग करना चाहता हूं।

+0

देखना भी - http://bayou.io/release/1.0/docs/http/Http_Client.html – ZhongYu

उत्तर

133

हम मल्टीपार्ट फ़ाइल पोस्ट बनाने के लिए HttpClient 4.x का उपयोग करते हैं।

अद्यतन: HttpClient 4.3 के रूप में, कुछ वर्गों को पदावनत किया गया है।

CloseableHttpClient httpClient = HttpClients.createDefault(); 
HttpPost uploadFile = new HttpPost("..."); 
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
builder.addTextBody("field1", "yes", ContentType.TEXT_PLAIN); 

// This attaches the file to the POST: 
File f = new File("[/path/to/upload]"); 
builder.addBinaryBody(
    "file", 
    new FileInputStream(f), 
    ContentType.APPLICATION_OCTET_STREAM, 
    f.getName() 
); 

HttpEntity multipart = builder.build(); 
uploadFile.setEntity(multipart); 
CloseableHttpResponse response = httpClient.execute(uploadFile); 
HttpEntity responseEntity = response.getEntity(); 

नीचे साथ कोड के मूल टुकड़ा पदावनत HttpClient 4.0 एपीआई है::

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost(url); 

FileBody bin = new FileBody(new File(fileName)); 
StringBody comment = new StringBody("Filename: " + fileName); 

MultipartEntity reqEntity = new MultipartEntity(); 
reqEntity.addPart("bin", bin); 
reqEntity.addPart("comment", comment); 
httppost.setEntity(reqEntity); 

HttpResponse response = httpclient.execute(httppost); 
HttpEntity resEntity = response.getEntity(); 
+60

आह, बहुखण्डीय सामान ले जाया गया है org.apache.httpcomponents-httpmime-4.0 ! कहीं भी उल्लेख किया जा सकता है:/ –

+0

मैंने आपके अपडेट किए गए कोड को आजमाया जो छोटी फाइलों के साथ ठीक काम करता है लेकिन बड़ी फाइलों के साथ काम नहीं करता है। क्या आप इस [प्रश्न] के साथ मेरी मदद कर सकते हैं (http://stackoverflow.com/questions/25850077/how-to-upload-large-files-by-multipart-request-in-java) – abi1964

+0

हाय जेडजेड, मैंने बनाया है मेरे कोड में उपर्युक्त परिवर्तन, हालांकि, मुझे अब एक नई समस्या का सामना करना पड़ रहा है - मेरा आरईएसटी एंडपॉइंट अनुरोध स्वीकार नहीं कर रहा है। यह निम्नलिखित मानकों की अपेक्षा कर रहा है: ~ @ पथवर्तनीय अंतिम स्ट्रिंग आईडी, @RequestParam ("छवि") अंतिम मल्टीपार्ट फ़ाइल छवि, @RequestParam ("एल") अंतिम स्ट्रिंग एल, @RequestParam ("लो") अंतिम स्ट्रिंग लो, @RequestParam ("बीएसी") अंतिम स्ट्रिंग बीएसी, @RequestParam ("सीएसी") अंतिम स्ट्रिंग सीएसी, @RequestParam ("एम") अंतिम स्ट्रिंग एम ... पहले, अनुरोध स्वीकार किया जा रहा था। लेकिन अब मुझे 500 त्रुटि मिल रही है। कोई विचार यह क्यों हो रहा है? – Logan

2

httpcomponents-client-4.0.1 मेरे लिए काम किया यहाँ नई एपीआई के साथ कोड है। हालांकि, मुझे बाहरी जार apache-mime4j-0.6.jar (org.apache.james.mime4j) अन्यथा reqEntity.addPart("bin", bin); संकलित नहीं करना था। अब यह आकर्षण की तरह काम कर रहा है।

34

ये मेरे पास मेवेन निर्भरताएं हैं।

जावा कोड: pom.xml में

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httpPost = new HttpPost(url); 

FileBody uploadFilePart = new FileBody(uploadFile); 
MultipartEntity reqEntity = new MultipartEntity(); 
reqEntity.addPart("upload-file", uploadFilePart); 
httpPost.setEntity(reqEntity); 

HttpResponse response = httpclient.execute(httpPost); 

Maven निर्भरता:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.0.1</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpmime</artifactId> 
    <version>4.0.1</version> 
    <scope>compile</scope> 
</dependency> 
+4

+1। समय बचाने वाला! –

+1

आपको 'httpEntity' class – alalonde

4

तुम भी REST Assured HTTP क्लाइंट पर बनाता है जो उपयोग कर सकते हैं। जार मामलों के आकार (जैसे एप्लेट के मामले में), एक भी सीधे httpmime बजाय HttpClient की java.net.HttpURLConnection साथ उपयोग कर सकते हैं

given().multiPart(new File("/somedir/file.bin")).when().post("/fileUpload"); 
+0

' के लिए कम से कम 4.2 में httpcore की आवश्यकता होगी, यह "फ़ाइल" नामक एक नियंत्रण नाम मान लेगा। यदि आपके पास एक अलग नियंत्रण नाम है तो आपको इसे निर्दिष्ट करने की आवश्यकता है: 'मल्टीपार्ट ("कंट्रोलनाम", नई फ़ाइल ("/ somedir/file.bin"))', https://github.com/rest-assured/rest देखें -सुरक्षित/विकी/उपयोग # बहु-भाग-फॉर्म-डेटा – asmaier

14

: यह बहुत आसान है।

httpclient-4.2.4:  423KB 
httpmime-4.2.4:   26KB 
httpcore-4.2.4:  222KB 
commons-codec-1.6:  228KB 
commons-logging-1.1.1: 60KB 
Sum:     959KB 

httpmime-4.2.4:   26KB 
httpcore-4.2.4:  222KB 
Sum:     248KB 

कोड:

पोम में
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setDoOutput(true); 
connection.setRequestMethod("POST"); 

FileBody fileBody = new FileBody(new File(fileName)); 
MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.STRICT); 
multipartEntity.addPart("file", fileBody); 

connection.setRequestProperty("Content-Type", multipartEntity.getContentType().getValue()); 
OutputStream out = connection.getOutputStream(); 
try { 
    multipartEntity.writeTo(out); 
} finally { 
    out.close(); 
} 
int status = connection.getResponseCode(); 
... 

निर्भरता।xml:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpmime</artifactId> 
    <version>4.2.4</version> 
</dependency> 
+0

फ़ाइलबॉडी जहां से यह आया था? Apace.httpcomponents का उपयोग नहीं करने के लिए एक (आसान) तरीका है? –

4

इस कोड का प्रयोग करें सर्वर बहुखण्डीय में पद का उपयोग कर के लिए छवियों या किसी अन्य फ़ाइलों को अपलोड करने।

import java.io.File; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 

import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.ResponseHandler; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.MultipartEntity; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.entity.mime.content.StringBody; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.apache.http.impl.client.DefaultHttpClient; 

public class SimplePostRequestTest { 

    public static void main(String[] args) throws UnsupportedEncodingException, IOException { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://192.168.0.102/uploadtest/upload_photo"); 

     try { 
      FileBody bin = new FileBody(new File("/home/ubuntu/cd.png")); 
      StringBody id = new StringBody("3"); 
      MultipartEntity reqEntity = new MultipartEntity(); 
      reqEntity.addPart("upload_image", bin); 
      reqEntity.addPart("id", id); 
      reqEntity.addPart("image_title", new StringBody("CoolPic")); 

      httppost.setEntity(reqEntity); 
      System.out.println("Requesting : " + httppost.getRequestLine()); 
      ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
      String responseBody = httpclient.execute(httppost, responseHandler); 
      System.out.println("responseBody : " + responseBody); 

     } catch (ClientProtocolException e) { 

     } finally { 
      httpclient.getConnectionManager().shutdown(); 
     } 
    } 

} 

इसे अपलोड करने के लिए नीचे फ़ाइलों की आवश्यकता है।

पुस्तकालयों httpclient-4.1.2.jar, httpcore-4.1.2.jar, httpmime-4.1.2.jar, httpclient-cache-4.1.2.jar, commons-codec.jar और commons-logging-1.1.1.jar classpath में होना करने के लिए कर रहे हैं।

0

हमारे पास मल्टीपार्ट-फॉर्म का शुद्ध जावा कार्यान्वयन है जो बिना किसी बाह्य निर्भरता या जेडीके के बाहर पुस्तकालयों का उपयोग किए सबमिट करता है। देखें https://github.com/atulsm/https-multipart-purejava/blob/master/src/main/java/com/atul/MultipartPure.java

private static String body = "{\"key1\":\"val1\", \"key2\":\"val2\"}"; 
private static String subdata1 = "@@ -2,3 +2,4 @@\r\n"; 
private static String subdata2 = "<data>subdata2</data>"; 

public static void main(String[] args) throws Exception{   
    String url = "https://" + ip + ":" + port + "/dataupload"; 
    String token = "Basic "+ Base64.getEncoder().encodeToString((userName+":"+password).getBytes()); 

    MultipartBuilder multipart = new MultipartBuilder(url,token);  
    multipart.addFormField("entity", "main", "application/json",body); 
    multipart.addFormField("attachment", "subdata1", "application/octet-stream",subdata1); 
    multipart.addFormField("attachment", "subdata2", "application/octet-stream",subdata2);   
    List<String> response = multipart.finish();   
    for (String line : response) { 
     System.out.println(line); 
    } 
} 
संबंधित मुद्दे

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