Code ví dụ upload file bằng Java với HttpClient

Code ví dụ upload file bằng Java với HttpClient

(Xem lại: Code ví dụ gửi http post request bằng Java – HttpClient)

Công nghệ sử dụng

Tạo server

Ở bài này mình sử dụng project SpringBootUploadFile để làm server (nó sẽ cung cấp chức năng cho phép người dùng upload file).
Bạn chỉ cần download project về và chạy thôi.

(Xem lại: Code ví dụ Spring Boot Upload file)

(Xem lại: Code ví dụ Spring Boot Upload file)

Tạo Maven Project (Client)

Client sẽ upload file từ trong code java chứ không sử dụng đến trình duyệt như ví dụ trên.

Code ví dụ upload file bằng Java với HttpClient

Thư viện sử dụng

<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>fluent-hc</artifactId>
  <version>4.5.5</version>
</dependency>
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpmime</artifactId>
  <version>4.5.5</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Thư viện fluent-hc dùng để gửi http request (khi import fluent-hc nó sẽ tự động import những thư viện liên quan như httpcore, httpclient)

Thư viện httpmime dùng cho việc gửi request với file đính kèm

Thư viện commons-io dùng để đọc ghi inputstream/outputstream (ở đây mình dùng để đọc dữ liệu trả về trong response)

Upload file với HttpClient – Post

package stackjava.com.httpclientuploadfile.demo;

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

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class DemoUpload {
  public static void main(String[] args) throws ClientProtocolException, IOException {
    File fileUpload = new File("file/demo.txt");
    String url = "http://localhost:8080/uploadFile";
    uploadFile(fileUpload, url);
  }

  public static void uploadFile(File file, String url) throws ClientProtocolException, IOException {
    CloseableHttpClient client = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost(url);

    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    builder.addBinaryBody("multipartFile", file, ContentType.APPLICATION_OCTET_STREAM, file.getName());
    builder.addTextBody("description", "my description");
    HttpEntity multipart = builder.build();
    httpPost.setEntity(multipart);
    HttpResponse httpResponse = client.execute(httpPost);
    System.out.println("Status:" + httpResponse.getStatusLine().toString());
    System.out.println("Content:");
    String content = IOUtils.toString(httpResponse.getEntity().getContent(), "UTF-8");
    System.out.println("--------------------------------------------------------");
    System.out.println(content);
  }
}

Ở bài trước chúng ta thực hiện post request với dữ liệu JSON hoặc các parameter giống như html form, còn ở đây chúng ta sử dụng MultipartEntityBuilder để post dữ liệu file, text.

Trong ví dụ này mình thực hiện upload file demo.txt và 1 tham số là description với thông tin ‘my description’

Demo:

Code ví dụ upload file bằng Java với HttpClient Code ví dụ upload file bằng Java với HttpClient

Upload file với Progress Bar (Hiển thị phầm trăm upload)

package stackjava.com.httpclientuploadfile.demo.progress;

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

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class UploadFileWithProgress {
  public static void main(String[] args) throws ClientProtocolException, IOException {
    File fileUpload = new File("file/demo.txt");
    String url = "http://localhost:8080/uploadFile";
    uploadFile(fileUpload, url);
  }

  public static void uploadFile(File file, String url) throws ClientProtocolException, IOException {
    CloseableHttpClient client = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost(url);

    MultipartEntityBuilder builder = MultipartEntityBuilder.create();
    // builder.addBinaryBody(file.getName(), file);
    builder.addBinaryBody("multipartFile", file, ContentType.APPLICATION_OCTET_STREAM, file.getName());
    builder.addTextBody("description", "my description");
    HttpEntity multipart = builder.build();

    // httpPost.setEntity(multipart);
    MyProgressListener pListener = new MyProgressListener() {
      
      @Override
      public void progress(float percentage) {
        System.out.println("progress: "+ percentage +" %");
        
      }
    };
    httpPost.setEntity(new MyProgressEntityWrapper(multipart, pListener));

    HttpResponse httpResponse = client.execute(httpPost);
    System.out.println("Status:" + httpResponse.getStatusLine().toString());
    System.out.println("Content:");
    String content = IOUtils.toString(httpResponse.getEntity().getContent(), "UTF-8");
    System.out.println("--------------------------------------------------------");
    System.out.println(content);
  }

}

Demo

Code ví dụ upload file bằng Java với HttpClient

Code ví dụ upload file bằng Java với HttpClient stackjava.com

Okay, Done!

Download code ví dụ trên tại đây.

 

References:

https://hc.apache.org/

https://hc.apache.org/httpcomponents-core-ga/tutorial/html/index.html

https://hc.apache.org/httpcomponents-client-ga/tutorial/html/

http://www.baeldung.com/httpclient-post-http-request

stackjava.com