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)
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.
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:
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 stackjava.com
Okay, Done!
Download code ví dụ trên tại đây.
References:
https://hc.apache.org/httpcomponents-core-ga/tutorial/html/index.html
https://hc.apache.org/httpcomponents-client-ga/tutorial/html/