Wie kann ich mit Java eine POST-Anfrage mit mehreren Teilen/Formulardaten erstellen?

Lesezeit: 6 Minuten

In den Tagen der Version 3.x von Apache Commons HttpClient war es möglich, eine POST-Anforderung mit mehreren Teilen/Formulardaten zu erstellen (ein Beispiel aus dem Jahr 2004). Leider ist dies in nicht mehr möglich Version 4.0 von HttpClient.

Für unsere Kernaktivität “HTTP” ist Multipart etwas außerhalb des Anwendungsbereichs. Wir würden gerne mehrteiligen Code verwenden, der von einem anderen Projekt gepflegt wird, für das er in den Geltungsbereich gehört, aber mir ist keiner bekannt. Wir haben vor ein paar Jahren versucht, den mehrteiligen Code in den Commons-Codec zu verschieben, aber ich bin dort nicht gestartet. Oleg hat kürzlich ein anderes Projekt erwähnt, das mehrteiligen Parsing-Code hat und an unserem mehrteiligen Formatierungscode interessiert sein könnte. Den aktuellen Stand dazu kenne ich nicht. (http://www.nabble.com/multipart-form-data-in-4.0-td14224819.html)

Kennt jemand eine Java-Bibliothek, die es mir ermöglicht, einen HTTP-Client zu schreiben, der eine POST-Anforderung mit mehreren Teilen/Formulardaten stellen kann?

Hintergrund: Ich möchte die verwenden Remote-API von Zoho Writer.

Wie kann ich mit Java eine POST Anfrage mit mehreren TeilenFormulardaten
ZZ-Codierer

Wir verwenden HttpClient 4.x, um mehrteilige Dateien zu posten.

AKTUALISIEREN: Ab HttpClient 4.3, sind einige Klassen veraltet. Hier ist der Code mit neuer API:

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

Unten ist das ursprüngliche Code-Snippet mit veraltete HttpClient 4.0-API:

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

  • Ah, das mehrteilige Zeug wurde nach org.apache.httpcomponents-httpmime-4.0 verschoben! Könnte irgendwo erwähnt werden :/

    lutz

    4. September 2009 um 13:00 Uhr

  • Ich habe Ihren aktualisierten Code ausprobiert, der mit kleinen Dateien gut funktioniert, aber nicht mit großen Dateien. Können Sie mir bei dieser Frage helfen

    – AabinGunz

    19. September 2014 um 5:25 Uhr


  • Hallo ZZ, ich habe die obige Änderung in meinem Code vorgenommen, aber ich stehe jetzt vor einem neuen Problem – mein REST-Endpunkt akzeptiert die Anfrage nicht. Es erwartet die folgenden Parameter: [email protected] final String id, @RequestParam(“image”) final MultipartFile image, @RequestParam(“l”) final String l, @RequestParam(“lo”) final String lo, @RequestParam(” bac”) final String bac, @RequestParam(“cac”) final String cac, @RequestParam(“m”) final String m … Bisher wurde die Anfrage akzeptiert. Aber jetzt bekomme ich 500 Fehler. Irgendwelche Ideen, warum dies passieren könnte?

    – Logan

    27. Juli 2015 um 10:59 Uhr


  • Ich habe die Antwort so bearbeitet, dass das Codebeispiel nicht mehr horizontal scrollt – das Scrollen hat dazu geführt, dass ich einen wichtigen letzten Parameter verpasst habe, als ich versuchte, es in meiner eigenen Arbeit zu verwenden.

    – G. Sylvie Davies

    14. Juli 2016 um 19:56 Uhr


  • Hier sind die Maven-Abhängigkeiten für die aktualisierte Antwort org.apache.httpcomponents httpclient 4.3.6 org.apache.httpcomponents httpmime 4.3.6

    – Wazime

    3. November 2017 um 16:47 Uhr

Dies sind die Maven-Abhängigkeiten, die ich habe.

Java-Code:

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-Abhängigkeiten in 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>

  • Sie benötigen auch httpcore, zumindest in 4.2, für die HttpEntity Klasse

    – alalonde

    3. Juli 2012 um 3:58 Uhr

Wie kann ich mit Java eine POST Anfrage mit mehreren TeilenFormulardaten
anre

Wenn es auf die Größe der JARs ankommt (zB bei Applets), kann man statt HttpClient auch direkt httpmime mit java.net.HttpURLConnection verwenden.

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

Code:

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

Abhängigkeit in pom.xml:

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

  • FileBody, woher das kam? Gibt es eine (einfache) Möglichkeit, apace.httpcomponents nicht zu verwenden?

    – jr.

    5. Januar 2016 um 19:13 Uhr

Verwenden Sie diesen Code, um Bilder oder andere Dateien mithilfe von Post in Multipart auf den Server hochzuladen.

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

}

Zum Hochladen sind die folgenden Dateien erforderlich.

Bibliotheken sind
httpclient-4.1.2.jar,
httpcore-4.1.2.jar,
httpmime-4.1.2.jar,
httpclient-cache-4.1.2.jar,
commons-codec.jar und
commons-logging-1.1.1.jar im Klassenpfad sein.

1646348827 87 Wie kann ich mit Java eine POST Anfrage mit mehreren TeilenFormulardaten
Benutzer1005939

Hier ist eine Lösung, die keine Bibliotheken benötigt.

Diese Routine überträgt jede Datei im Verzeichnis d:/data/mpf10 zu 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

1646348828 236 Wie kann ich mit Java eine POST Anfrage mit mehreren TeilenFormulardaten
Johann

Sie können auch verwenden Seien Sie versichert die auf dem HTTP-Client aufbaut. Es ist sehr einfach:

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

1646348828 182 Wie kann ich mit Java eine POST Anfrage mit mehreren TeilenFormulardaten
Ankur Mahajan

httpcomponents-client-4.0.1 hat bei mir funktioniert. Allerdings musste ich das externe Glas hinzufügen apache-mime4j-0.6.jar (org.apache.james.mime4j) Andernfalls
reqEntity.addPart("bin", bin); würde nicht kompilieren. Jetzt funktioniert es wie am Schnürchen.

928390cookie-checkWie kann ich mit Java eine POST-Anfrage mit mehreren Teilen/Formulardaten erstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy