web-dev-qa-db-ja.com

Javaを使用してmultipart / form-data POSTリクエストを作成するにはどうすればよいですか?

Apache Commons HttpClientのバージョン3.xの時代には、multipart/form-data POSTリクエストを作成することが可能でした( 2004年の例 )。残念ながら、これは HttpClientのバージョン4. ではできなくなりました。

コアアクティビティ「HTTP」の場合、multipartは範囲外です。範囲内にある他のプロジェクトで管理されているマルチパートコードを使用したいのですが、私は何も知りません。数年前にマルチパートコードをcommons-codecに移動しようとしましたが、私はそこで始めませんでした。 Olegは最近、マルチパート解析コードを持ち、マルチパートフォーマットコードに興味があるかもしれない別のプロジェクトに言及しました。私はそれに関する現在の状態を知りません。 ( http://www.nabble.com/multipart-form-data-in-4.0-td14224819.html

Multipart/form-data Javaリクエストを作成できるHTTPクライアントを作成できるPOSTライブラリを知っている人はいますか?

背景: Zoho WriterのリモートAPI を使用したい。

86
lutz

HttpClient 4.xを使用して、マルチパートファイルポストを作成します。

UPDATEHttpClient 4.3以降、一部のクラスは廃止されました。新しい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();

以下は、非推奨の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();
144
ZZ Coder

これらは私が持っているMavenの依存関係です。

Javaコード:

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の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>
39

JARのサイズが重要な場合(アプレットの場合など)、HttpClientの代わりにJava.net.HttpURLConnectionでhttpmimeを直接使用することもできます。

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>
18
anre

このコードを使用して、マルチパートの投稿を使用して画像またはその他のファイルをサーバーにアップロードします。

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です。

5
Java Man

REST Assured を使用して、HTTPクライアント上でビルドすることもできます。とても簡単です:

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

httpcomponents-client-4.0.1は私のために働いた。ただし、外部jar Apache-mime4j-0.6.jarorg.Apache.james.mime4j)を追加する必要がありました。そうしないと、reqEntity.addPart("bin", bin);がコンパイルされません。今では魅力のように機能しています。

2
Bob Yoplait

Apacheの クイックスタートガイドこのサンプル が見つかりました。バージョン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();
        }
    }
}
1
Amber

これは、ライブラリを必要としないソリューションです。

このルーチンは、ディレクトリ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();
1
user1005939