Apache HttpClient - การอัปโหลดหลายส่วน

การใช้ HttpClient เราสามารถทำการอัปโหลดหลายส่วนได้กล่าวคือเราสามารถอัปโหลดวัตถุขนาดใหญ่ในส่วนที่เล็กกว่าได้ ในบทนี้เราจะสาธิตการอัปโหลดหลายส่วนในไคลเอนต์ HTTP โดยการอัปโหลดไฟล์ข้อความธรรมดา

โดยทั่วไปการอัปโหลดหลายส่วนจะมีสามส่วน

  • การเริ่มต้นการอัปโหลด

  • การอัปโหลดชิ้นส่วนวัตถุ

  • เสร็จสิ้นการอัปโหลดหลายส่วน

สำหรับการอัปโหลดหลายส่วนโดยใช้ HttpClient เราจำเป็นต้องทำตามขั้นตอนด้านล่างนี้ -

  • สร้างตัวสร้างหลายส่วน

  • เพิ่มชิ้นส่วนที่ต้องการลงไป

  • สร้างบิลด์ให้เสร็จสมบูรณ์และรับ HttpEntity แบบหลายส่วน

  • สร้างคำขอโดยการตั้งค่าเอนทิตีส่วนย่อยข้างต้น

  • ดำเนินการตามคำขอ

ต่อไปนี้เป็นขั้นตอนในการอัปโหลดเอนทิตีแบบหลายส่วนโดยใช้ไลบรารี HttpClient

ขั้นตอนที่ 1 - สร้างวัตถุ HttpClient

createDefault() วิธีการของ HttpClients คลาสส่งคืนอ็อบเจ็กต์ของคลาส CloseableHttpClientซึ่งเป็นการใช้งานอินเทอร์เฟซ HttpClient พื้นฐาน ใช้วิธีนี้สร้างวัตถุ HttpClient -

//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();

ขั้นตอนที่ 2 - สร้างวัตถุ FileBody

FileBodyคลาสแสดงถึงส่วนของร่างกายไบนารีที่สนับสนุนโดยไฟล์ สร้างอินสแตนซ์คลาสนี้โดยส่งไฟล์File วัตถุและ ContentType วัตถุที่แสดงถึงประเภทของเนื้อหา

//Creating a File object
File file = new File("sample.txt");

//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);

ขั้นตอนที่ 3 - สร้าง MultipartEntityBuilder

MultipartEntityBuilder คลาสใช้ในการสร้างหลายส่วน HttpEntityวัตถุ. สร้างวัตถุโดยใช้create() วิธีการ (ของคลาสเดียวกัน)

//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();

ขั้นตอนที่ 4 - ตั้งค่าโหมด

MultipartEntityBuilderมีสามโหมด: STRICT, RFC6532 และ BROWSER_COMPATIBLE ตั้งค่าเป็นโหมดที่ต้องการโดยใช้setMode() วิธี.

//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

ขั้นตอนที่ 5 - เพิ่มส่วนต่างๆที่ต้องการ

โดยใช้วิธีการ addTextBody(), addPart () และ, addBinaryBody()คุณสามารถเพิ่มข้อความไฟล์สตรีมและวัตถุอื่น ๆ ลงในไฟล์ MultipartBuilder. เพิ่มเนื้อหาที่ต้องการโดยใช้วิธีการเหล่านี้

//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));

ขั้นตอนที่ 6 - การสร้างเอนทิตีเดียว

คุณสามารถสร้างส่วนเหล่านี้ทั้งหมดเป็นเอนทิตีเดียวโดยใช้ไฟล์ build() วิธีการของ MultipartEntityBuilderชั้นเรียน ใช้วิธีนี้สร้างชิ้นส่วนทั้งหมดให้เป็นชิ้นเดียวHttpEntity.

//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entityBuilder.build();

ขั้นตอนที่ 7 - สร้างวัตถุ RequestBuilder

ห้องเรียน RequestBuilderใช้ในการสร้างคำขอโดยการเพิ่มพารามิเตอร์เข้าไป หากคำขอเป็นประเภท PUT หรือ POST จะเพิ่มพารามิเตอร์ให้กับคำขอเป็นเอนทิตีเข้ารหัส URL

สร้างวัตถุ RequestBuilder (ประเภท POST) โดยใช้ไฟล์ post()วิธี. และส่ง Uri ที่คุณต้องการส่งคำขอเป็นพารามิเตอร์

//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");

ขั้นตอนที่ 8 - ตั้งค่าวัตถุเอนทิตีเป็น RequestBuilder

ตั้งค่าเอนทิตีหลายส่วนที่สร้างไว้ข้างต้นเป็น RequestBuilder โดยใช้ setEntity() วิธีการของ RequestBuilder ชั้นเรียน

//Setting the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);

ขั้นตอนที่ 9 - สร้าง HttpUriRequest

สร้างไฟล์ HttpUriRequest ร้องขอวัตถุโดยใช้ build() วิธีการของ RequestBuilder ชั้นเรียน

//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();

ขั้นตอนที่ 10 - ดำเนินการตามคำขอ

ใช้ execute() วิธีดำเนินการตามคำขอที่สร้างขึ้นในขั้นตอนก่อนหน้านี้ (ข้ามการร้องขอเป็นพารามิเตอร์ไปยังเมธอดนี้)

//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการส่งคำขอหลายส่วนโดยใช้ไลบรารี HttpClient ในตัวอย่างนี้เรากำลังพยายามส่งคำขอหลายส่วนที่สนับสนุนโดยไฟล์

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class MultipartUploadExample {
 
   public static void main(String args[]) throws Exception{

      //Creating CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();
 
      //Creating a file object
      File file = new File("sample.txt");

      //Creating the FileBody object
      FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);

      //Creating the MultipartEntityBuilder
      MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();

      //Setting the mode
      entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

      //Adding text
      entitybuilder.addTextBody("sample_text", "This is the text part of our file");

      //Adding a file
      entitybuilder.addBinaryBody("image", new File("logo.png"));

      //Building a single entity using the parts
      HttpEntity mutiPartHttpEntity = entitybuilder.build();

      //Building the RequestBuilder request object
      RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");

      //Set the entity object to the RequestBuilder
      reqbuilder.setEntity(mutiPartHttpEntity);

      //Building the request
      HttpUriRequest multipartRequest = reqbuilder.build();

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(multipartRequest);

      //Printing the status and the contents of the response
      System.out.println(EntityUtils.toString(httpresponse.getEntity()));
      System.out.println(httpresponse.getStatusLine());
   }
}

เอาต์พุต

ในการดำเนินการโปรแกรมด้านบนจะสร้างผลลัพธ์ต่อไปนี้ -

{
   "args": {},
   "data": "",
   "files": {
      "image": "data:application/octets66PohrH3IWNk1FzpohfdXPIfv9X3490FGcuXsHn9X0piCwomF/xdgADZ9GsfSyvLYAAAAAE
      lFTkSuQmCC"
   },
   "form": {
      "sample_text": "This is the text part of our file"
   },
   "headers": {
      "Accept-Encoding": "gzip,deflate",
      "Connection": "close",
      "Content-Length": "11104", 
      "Content-Type": "multipart/form-data;
      boundary=UFJbPHT7mTwpVq70LpZgCi5I2nvxd1g-I8Rt",
      "Host": "httpbin.org",
      "User-Agent": "Apache-HttpClient/4.5.6 (Java/1.8.0_91)"
   },
   "json": null,
   "origin": "117.216.245.180",
   "url": "http://httpbin.org/post"
}
HTTP/1.1 200 OK