106

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

私たちのコア アクティビティ "HTTP" では、マルチパートはやや範囲外です。スコープ内にある他のプロジェクトによって維持されているマルチパート コードを使用したいと考えていますが、私は何も知りません。数年前にマルチパート コードを commons-codec に移行しようとしましたが、私はそれを実行しませんでした。Oleg は最近、マルチパートの解析コードを持つ別のプロジェクトについて言及しており、マルチパートのフォーマット コードに興味があるかもしれません。そのあたりの現状はわかりません。( http://www.nabble.com/multipart-form-data-in-4.0-td14224819.html )

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

背景: Zoho Writerの Remote API を使いたい。

4

13 に答える 13

159

HttpClient 4.x を使用してマルチパート ファイルを投稿します。

更新: HttpClient 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();
于 2009-09-04T12:43:04.687 に答える
39

これらは私が持っている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>
于 2010-06-09T06:00:46.147 に答える
20

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>
于 2013-04-26T16:36:04.557 に答える
8

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

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.jarcommons-logging-1.1.1.jar

于 2014-11-29T09:41:42.777 に答える
4

HTTP クライアント上に構築されたREST Assuredを使用することもできます。とても簡単です:

given().multiPart(new File("/somedir/file.bin")).when().post("/fileUpload");
于 2011-09-16T06:57:19.937 に答える
2

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

于 2009-12-29T17:13:30.443 に答える