การอัปโหลดสื่อโดยตรงและทำต่อได้

เอกสารนี้จะอธิบายวิธีใช้การอัปโหลดสื่อโดยตรงและที่ดำเนินการต่อได้กับไลบรารีของไคลเอ็นต์ Google API สำหรับ Java

การอัปโหลดสื่อที่กลับมาดำเนินการต่อได้

เมื่อคุณอัปโหลดไฟล์สื่อขนาดใหญ่ไปยังเซิร์ฟเวอร์ ให้ใช้การอัปโหลดสื่อที่กลับมาทำงานต่อได้เพื่อส่งไฟล์สื่อทีละส่วน ไลบรารีที่ Google API สร้างขึ้นมีวิธีที่สะดวกในการโต้ตอบกับการอัปโหลดสื่อที่กลับมาทำงานอีกครั้ง

โปรโตคอลการอัปโหลดสื่อที่กลับมาทำงานอีกครั้งนั้นคล้ายกับโปรโตคอลการอัปโหลดสื่อที่กลับมาทำงานอีกครั้งได้ตามที่อธิบายไว้ในเอกสารประกอบของ Google ไดรฟ์ API

การออกแบบโปรโตคอล

แผนภาพลำดับต่อไปนี้แสดงวิธีการทำงานของโปรโตคอลการอัปโหลดสื่อที่กลับมาทำงานอีกครั้งได้
แผนภาพลำดับแสดงให้เห็นว่าคำขอและคำตอบเคลื่อนที่ระหว่างไคลเอ็นต์และเซิร์ฟเวอร์อย่างไร

รายละเอียดการใช้งาน

คลาสหลักที่สนใจคือ MediaHttpUploader และ MediaHttpProgressListener

หาก Method ในไลบรารีที่สร้างขึ้นเฉพาะบริการมีพารามิเตอร์ mediaUpload ในเอกสาร Discovery ระบบจะสร้างวิธีการอำนวยความสะดวกสำหรับเมธอดเหล่านี้ซึ่งใช้ InputStreamContent เป็นพารามิเตอร์ (สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้การอัปโหลดสื่อด้วยบริการ Discovery ของ Google APIs โปรดดูการอัปโหลดสื่อ)

ตัวอย่างเช่น เมธอด insert ของ Drive API รองรับ mediaUpload และคุณจะใช้รหัสต่อไปนี้เพื่ออัปโหลดไฟล์ได้

class CustomProgressListener implements MediaHttpUploaderProgressListener {
  public void progressChanged(MediaHttpUploader uploader) throws IOException {
    switch (uploader.getUploadState()) {
      case INITIATION_STARTED:
        System.out.println("Initiation has started!");
        break;
      case INITIATION_COMPLETE:
        System.out.println("Initiation is complete!");
        break;
      case MEDIA_IN_PROGRESS:
        System.out.println(uploader.getProgress());
        break;
      case MEDIA_COMPLETE:
        System.out.println("Upload is complete!");
    }
  }
}

File mediaFile = new File("/tmp/driveFile.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

Drive.Files.Insert request = drive.files().insert(fileMetadata, mediaContent);
request.getMediaHttpUploader().setProgressListener(new CustomProgressListener());
request.execute();

นอกจากนี้ คุณยังใช้ฟีเจอร์การอัปโหลดสื่อที่กลับมาทำงานอีกครั้งได้โดยไม่มีไลบรารีที่สร้างขึ้นเฉพาะบริการ ตัวอย่างเช่น

File mediaFile = new File("/tmp/Test.jpg");
InputStreamContent mediaContent =
    new InputStreamContent("image/jpeg",
        new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent.setLength(mediaFile.length());

MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, transport, httpRequestInitializer); uploader.setProgressListener(new CustomProgressListener()); HttpResponse response = uploader.upload(requestUrl); if (!response.isSuccessStatusCode()) { throw GoogleJsonResponseException(jsonFactory, response); }

การอัปโหลดสื่อโดยตรง

การอัปโหลดสื่อที่ดำเนินการต่อได้จะเปิดใช้อยู่โดยค่าเริ่มต้น แต่คุณสามารถปิดใช้และใช้การอัปโหลดสื่อโดยตรงแทนได้ เช่น หากคุณกำลังอัปโหลดไฟล์ขนาดเล็ก การอัปโหลดสื่อโดยตรงเปิดตัวในไลบรารีของไคลเอ็นต์ Google API สำหรับ Java เวอร์ชัน 1.9.0-beta

การอัปโหลดสื่อโดยตรงจะอัปโหลดไฟล์ทั้งไฟล์ในคำขอ HTTP รายการเดียว ซึ่งต่างจากโปรโตคอลการอัปโหลดสื่อที่ดำเนินการต่อได้ ซึ่งจะอัปโหลดไฟล์ในคำขอหลายรายการ การอัปโหลดโดยตรงจะช่วยลดจำนวนคำขอ HTTP แต่จะเป็นการเพิ่มโอกาสของความล้มเหลว (เช่น การเชื่อมต่อล้มเหลว) ที่อาจเกิดขึ้นกับการอัปโหลดขนาดใหญ่

การใช้งานสำหรับการอัปโหลดสื่อโดยตรงจะเหมือนกับที่อธิบายไว้ข้างต้นสำหรับการอัปโหลดสื่อที่ดำเนินการต่อได้ รวมถึงมีการเรียกที่บอก MediaHttpUploader ให้อัปโหลดโดยตรงเท่านั้น

mediaHttpUploader.setDirectUploadEnabled(true);