আমি জাভা ব্যবহার করে কীভাবে একটি বহুগুণ / ফর্ম-ডেটা পোষ্ট অনুরোধ করতে পারি?


97

অ্যাপাচি কমন্স এইচটিপিপ্লিয়েন্টের সংস্করণ 3.x এর দিনগুলিতে, একটি বহুগুণ / ফর্ম-ডেটা পোষ্ট অনুরোধ করা সম্ভব হয়েছিল ( উদাহরণস্বরূপ 2004 )। দুর্ভাগ্যক্রমে এটি আর এইচটিটিপিপ্লায়েন্টের 4.0 সংস্করণে সম্ভব নয় ।

আমাদের মূল ক্রিয়াকলাপ "এইচটিটিপি" এর জন্য, মাল্টিপার্ট কিছুটা সুযোগের বাইরে। আমরা অন্য কোনও প্রকল্পের দ্বারা রক্ষণাবেক্ষণের মাল্টিপার্ট কোডটি ব্যবহার করতে চাই, এটির সুযোগ রয়েছে তবে আমি কোনওটি সম্পর্কে অবগত নই। আমরা কয়েক বছর আগে মাল্টিপার্ট কোডটি কমন্স-কোডেকে স্থানান্তরিত করার চেষ্টা করেছি, কিন্তু আমি সেখানে নামলাম না। ওলেগ সম্প্রতি আরেকটি প্রকল্পের উল্লেখ করেছেন যার মধ্যে মাল্টিপার্ট পার্সিং কোড রয়েছে এবং এটি আমাদের মাল্টিপার্ট ফর্ম্যাটিং কোডে আগ্রহী হতে পারে। আমি তার বর্তমান অবস্থা জানি না। ( http://www.nabble.com/multipart-form-data-in-4.0-td14224819.html )

এমন কোনও জাভা লাইব্রেরি সম্পর্কে কি কেউ সচেতন যা আমাকে এমন একটি এইচটিটিপি ক্লায়েন্ট লিখতে দেয় যা মাল্টিপার্ট / ফর্ম-ডেটা পোষ্ট অনুরোধ করতে পারে?

পটভূমি: আমি জোহো রাইটরের রিমোট এপিআই ব্যবহার করতে চাই ।


আরও দেখুন - বায়ু.আইও
রিলেজ

উত্তর:


152

আমরা মাল্টিপার্ট ফাইল পোস্ট করতে HttpClient 4.x ব্যবহার করি।

আপডেট : এইচটিটিপিপ্লায়েন্ট ৪.৩ অনুসারে কিছু শ্রেণি অবচিত করা হয়েছে। নতুন এপিআই সহ কোডটি এখানে রয়েছে:

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

নীচে অবহেলিত এইচটিটিপিপ্লাইয়েন্ট 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();

63
আহা, মাল্টিপার্ট স্টাফগুলি org.apache.httpcomp घटक-httpsime-4.0 এ সরানো হয়েছে! কোথাও উল্লেখ করা যেতে পারে: /

আমি আপনার আপডেট কোডটি চেষ্টা করেছি যা ছোট ফাইলগুলির সাথে দুর্দান্ত কাজ করে তবে বড় ফাইলগুলির সাথে কাজ করে না। আপনি কি এই প্রশ্নে
আবিনগঞ্জ

হাই জেডজেড, আমি আমার কোডে উপরের পরিবর্তনটি করেছি, তবে আমি এখন একটি নতুন সমস্যার মুখোমুখি হয়েছি - আমার আরআরএসটি শেষ পয়েন্টটি অনুরোধটি গ্রহণ করছে না। এটি নিম্নলিখিত প্যারামিটারগুলির প্রত্যাশা করছে: Path @ প্যাথভেরিয়েবল চূড়ান্ত স্ট্রিং আইডি, @RequestParam ("চিত্র") চূড়ান্ত মাল্টিপার্টফাইল চিত্র, @RequestParam ("l") চূড়ান্ত স্ট্রিং l, @RequestParam ("লো") চূড়ান্ত স্ট্রিং লো, @ অনুসন্ধানপ্রাম (" "" চূড়ান্ত স্ট্রিং ব্যাক, @ রেকুয়েস্টপ্রাম ("ক্যাক") চূড়ান্ত স্ট্রিং ক্যাক, @ রেকুয়েস্টপ্রাম ("মি") ফাইনাল স্ট্রিং এম ... পূর্বে, অনুরোধটি গৃহীত হয়েছিল। তবে এখন আমি 500 ত্রুটি পাচ্ছি। কোনও ধারণা কেন এমন হচ্ছে?
লোগান

আমি উত্তরটি সম্পাদনা করেছি যাতে কোড উদাহরণটি আর অনুভূমিক স্ক্রোল না করে --- আমার নিজের কাজে এটি ব্যবহার করার চেষ্টা করার সময় স্ক্রোলটি আমাকে একটি গুরুত্বপূর্ণ চূড়ান্ত পরামিতি মিস করতে পারে।
জি। সিলভি ডেভিস

<d dependency> <groupId> org.apache.http কম্পিউটারগুলি </ গোষ্ঠী << আর্টিফ্যাক্ট আইডি> httpclient </artifactId> <version> 4.3.6 </version> </d dependency> <! - mvnrepository.com/artifact/org.apache.httpcompferences/httpmime -> <d depend depend> <groupId> org.apache.httpcomponents </groupId> <artifactId> httpsime </artifactId> <version> 4.3.6 </version> < / নির্ভরতা>
ওয়াজিম

39

এগুলি হ'ল মাভেন নির্ভরতা।

জাভা কোড:

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

Pom.xML এ মাভেন নির্ভরতা:

<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
আপনার HttpEntityক্লাসের জন্য কমপক্ষে ৪.২ এর মধ্যেও, httpरेর দরকার হবে
alalonde

19

JARs এর আকারের বিষয়টি বিবেচনা করে (যেমন অ্যাপ্লিটের ক্ষেত্রে), কেউ সরাসরি জাভা.নেট.এইচটিপিএমএলএইচটিপিএমএলএইচটিপিএলটির পরিবর্তে httpsime ব্যবহার করতে পারেন।

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

Pom.xML এ নির্ভরতা:

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

ফাইলবিডি কোথা থেকে এলো? Apace.httpcomp घटक ব্যবহার না করার একটি (সহজ) উপায় আছে?
জুনিয়র

6

মাল্টিপার্টে পোস্ট ব্যবহার করে সার্ভারে চিত্র বা অন্য কোনও ফাইল আপলোড করতে এই কোডটি ব্যবহার করুন।

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ক্লাসপাথ করা।


4

আপনি এইচটিটিপি ক্লায়েন্টের উপর ভিত্তি করে আরআরএসএস্ট নিশ্চিত হওয়াও ব্যবহার করতে পারেন । এটা খুবই সাধারণ:

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

এটি "ফাইল" নামক একটি নিয়ন্ত্রণ নাম ধরে নিবে। তারপর আপনি একটি ভিন্ন নিয়ন্ত্রণ নাম থাকে, তাহলে আপনি এটা উল্লেখ করা প্রয়োজন: multiPart("controlName", new File("/somedir/file.bin"))দেখুন github.com/rest-assured/rest-assured/wiki/...
asmaier

REST Assured এর দুর্দান্ত এপিআই রয়েছে এবং অনেকগুলি বৈশিষ্ট্য সমর্থন করে। এটির সাথে কাজ করা একটি আনন্দের বিষয়। তবে ন্যায়সঙ্গতভাবে এটি উল্লেখ করা দরকার যে কিছু উষ্ণতর পদ্ধতির কারণে আপনি প্রথম কলটিতে কর্মক্ষমতা হ্রাস পেতে পারেন। আপনি ইন্টারনেটে আরও তথ্যের সন্ধান করতে পারেন এখানে sqa.stackexchange.com/questions/39532/…
user1053510

REST Assured একটি উজ্জ্বল গ্রন্থাগার, তবে এটি ওয়েব API টেস্টিংয়ের জন্য ডিজাইন করা হয়েছে এবং আমি মনে করি না যে এটি উত্পাদন কোডে এইচটিটিপি কল করার সঠিক সরঞ্জাম, যদিও এটি একই অন্তর্নিহিত লাইব্রেরি ব্যবহার করে।
রানিল বিজয়েরত্নে

3

এখানে এমন একটি সমাধান রয়েছে যাতে কোনও গ্রন্থাগারের প্রয়োজন হয় না।

এই রুটিন ডিরেক্টরির মধ্যে প্রতিটি ফাইল প্রেরণ d:/data/mpf10করার জন্যurlToConnect


String boundary = Long.toHexString(System.currentTimeMillis());
URLConnection connection = new URL(urlToConnect).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
PrintWriter writer = null;
try {
    writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
    File dir = new File("d:/data/mpf10");
    for (File file : dir.listFiles()) {
        if (file.isDirectory()) {
            continue;
        }
        writer.println("--" + boundary);
        writer.println("Content-Disposition: form-data; name=\"" + file.getName() + "\"; filename=\"" + file.getName() + "\"");
        writer.println("Content-Type: text/plain; charset=UTF-8");
        writer.println();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
            for (String line; (line = reader.readLine()) != null;) {
                writer.println(line);
            }
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
    }
    writer.println("--" + boundary + "--");
} finally {
    if (writer != null) writer.close();
}
// Connection is lazily executed whenever you request any status.
int responseCode = ((HttpURLConnection) connection).getResponseCode();
// Handle response

2

httpcomponents-client-4.0.1আমার জন্য কাজ। যাইহোক, আমাকে বাহ্যিক জার apache-mime4j-0.6.jar ( org.apache.james.mime4j ) যুক্ত reqEntity.addPart("bin", bin);করতে হবে অন্যথায় সংকলন করবে না। এখন এটি কবজ মত কাজ করছে।


2

আমি অ্যাপাচি-র কুইকস্টার্ট গাইডে এই নমুনাটি পেয়েছি । এটি সংস্করণ 4.5 এর জন্য:

/**
 * Example how to use multipart/form encoded POST request.
 */
public class ClientMultipartFormPost {

    public static void main(String[] args) throws Exception {
        if (args.length != 1)  {
            System.out.println("File path not given");
            System.exit(1);
        }
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpPost httppost = new HttpPost("http://localhost:8080" +
                    "/servlets-examples/servlet/RequestInfoExample");

            FileBody bin = new FileBody(new File(args[0]));
            StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);

            HttpEntity reqEntity = MultipartEntityBuilder.create()
                    .addPart("bin", bin)
                    .addPart("comment", comment)
                    .build();


            httppost.setEntity(reqEntity);

            System.out.println("executing request " + httppost.getRequestLine());
            CloseableHttpResponse response = httpclient.execute(httppost);
            try {
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                HttpEntity resEntity = response.getEntity();
                if (resEntity != null) {
                    System.out.println("Response content length: " + resEntity.getContentLength());
                }
                EntityUtils.consume(resEntity);
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
    }
}

0

আমাদের কাছে jdk এর বাইরে কোনও বাহ্যিক নির্ভরতা বা লাইব্রেরি ব্যবহার না করে মাল্টিপার্ট-ফর্ম জমা দেওয়ার বিশুদ্ধ জাভা বাস্তবায়ন রয়েছে। পড়ুন 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);
    }
}

0

সার্ভারে আমার কোড পোস্ট মাল্টিপার্টফিল।

  public static HttpResponse doPost(
    String host,
    String path,
    String method,
    MultipartFile multipartFile
  ) throws IOException
  {

    HttpClient httpClient = wrapClient(host);
    HttpPost httpPost = new HttpPost(buildUrl(host, path));

    if (multipartFile != null) {

      HttpEntity httpEntity;

      ContentBody contentBody;
      contentBody = new ByteArrayBody(multipartFile.getBytes(), multipartFile.getOriginalFilename());
      httpEntity = MultipartEntityBuilder.create()
                                         .addPart("nameOfMultipartFile", contentBody)
                                         .build();

      httpPost.setEntity(httpEntity);

    }
    return httpClient.execute(httpPost);
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.