Unggahan Multibagian dengan HttpClient 4

1. Ikhtisar

Dalam tutorial ini, kami akan mengilustrasikan cara melakukan operasi pengunggahan multi-bagian menggunakan HttpClient 4 .

Kami akan menggunakan //echo.200please.com sebagai server pengujian karena bersifat publik dan menerima sebagian besar jenis konten.

Jika Anda ingin menggali lebih dalam dan mempelajari hal-hal keren lainnya yang dapat Anda lakukan dengan HttpClient - lanjutkan ke tutorial HttpClient utama.

2. Menggunakan Metode AddPart

Mari kita mulai dengan melihat objek MultipartEntityBuilder untuk menambahkan bagian ke entitas Http yang kemudian akan diunggah melalui operasi POST.

Ini adalah metode umum untuk menambahkan bagian ke HttpEntity yang mewakili formulir.

Contoh 2.1. - Mengunggah Formulir dengan Dua Bagian Teks dan File

File file = new File(textFileName); HttpPost post = new HttpPost("//echo.200please.com"); FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY); StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("upfile", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan bahwa kami membuat instance objek File dengan juga menentukan nilai ContentType yang akan digunakan oleh server.

Selain itu, perhatikan bahwa metode addPart memiliki dua argumen, yang bertindak seperti pasangan kunci / nilai untuk formulir. Ini hanya relevan jika sisi server benar-benar mengharapkan dan menggunakan nama parameter - jika tidak, mereka akan diabaikan begitu saja.

3. Menggunakan addBinaryBody dan addTextBody Metode

Cara yang lebih langsung untuk membuat entitas multi bagian adalah dengan menggunakan metode addBinaryBody dan AddTextBody . Metode ini berfungsi untuk mengunggah teks, file, larik karakter, dan objek InputStream . Mari kita ilustrasikan caranya dengan contoh sederhana.

Contoh 3.1. - Mengunggah Teks dan Bagian File Teks

HttpPost post = new HttpPost("//echo.200please.com"); File file = new File(textFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan bahwa objek FileBody dan StringBody tidak diperlukan di sini.

Yang juga penting, kebanyakan server tidak memeriksa ContentType dari badan teks, sehingga metode addTextBody dapat menghilangkan nilai ContentType .

The addBinaryBody API menerima ContentType - tetapi juga memungkinkan untuk membuat entitas hanya dari tubuh biner dan nama bentuk parameter memegang file. Seperti yang dinyatakan di bagian sebelumnya, beberapa server tidak akan mengenali file jika nilai ContentType tidak ditentukan.

Selanjutnya, kami akan menambahkan file zip sebagai InputStream, sedangkan file gambar akan ditambahkan sebagai objek File :

Contoh 3.2. - MenguploadFile Zip, File Gambar, dan Bagian Teks

HttpPost post = new HttpPost("//echo.200please.com"); InputStream inputStream = new FileInputStream(zipFileName); File file = new File(imageFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("upstream", inputStream, ContentType.create("application/zip"), zipFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan bahwa nilai ContentType dapat dibuat dengan cepat, seperti pada contoh di atas untuk file zip.

Terakhir, tidak semua server mengakui bagian InputStream . Server yang kami buat di baris pertama kode mengenali InputStream .

Sekarang mari kita lihat contoh lain di mana addBinaryBody bekerja secara langsung dengan array byte:

Contoh 3.3. - Mengupload Byte Array dan Teks

HttpPost post = new HttpPost("//echo.200please.com"); String message = "This is a multipart post"; byte[] bytes = "binary code".getBytes(); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Perhatikan ContentType - yang sekarang menetapkan data biner.

4. Kesimpulan

Artikel ini telah menyajikan MultipartEntityBuilder sebagai objek fleksibel yang menawarkan beberapa pilihan API untuk membuat formulir multi bagian.

Contoh juga menunjukkan bagaimana menggunakan HttpClient untuk mengunggah HttpEntity yang mirip dengan entitas formulir.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek GitHub kami - ini adalah proyek berbasis Eclipse, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.