เมื่อดาวน์โหลดไฟล์สื่อขนาดใหญ่จากเซิร์ฟเวอร์ ให้ใช้การดาวน์โหลดสื่อที่กลับมาทำงานอีกครั้งเพื่อดาวน์โหลดไฟล์สื่อทีละส่วน ไลบรารีที่ Google API สร้างขึ้นมีวิธีที่สะดวกในการโต้ตอบกับการดาวน์โหลดสื่อที่กลับมาทำงานอีกครั้ง
โปรโตคอลการดาวน์โหลดสื่อที่กลับมาใช้ใหม่ได้คล้ายกับโปรโตคอลการอัปโหลดสื่อที่กลับมาใช้งานอีกครั้งได้ ซึ่งอธิบายไว้ในเอกสารประกอบของ Google ไดรฟ์ API
รายละเอียดการใช้งาน
คลาสหลักที่สนใจคือ MediaHttpDownloader และ MediaHttpDownloaderProgressListener เนื้อหาสื่อจะดาวน์โหลดเป็นส่วนๆ และกำหนดค่าขนาดกลุ่มได้ หากพบข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์ในคำขอ ระบบจะลองส่งคำขออีกครั้ง
หากเมธอดในไลบรารีที่สร้างขึ้นเฉพาะบริการรองรับการดาวน์โหลดในเอกสาร Discovery ระบบจะสร้างวิธีดาวน์โหลดที่สะดวกสำหรับเมธอดดังกล่าวซึ่งจะใช้ใน OutputStream (ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้การดาวน์โหลดสื่อด้วย Google APIs Discovery Service ได้ที่การดาวน์โหลดสื่อ)
เช่น
class CustomProgressListener implements MediaHttpDownloaderProgressListener {
public void progressChanged(MediaHttpDownloader downloader) {
switch (downloader.getDownloadState()) {
case MEDIA_IN_PROGRESS:
System.out.println(downloader.getProgress());
break;
case MEDIA_COMPLETE:
System.out.println("Download is complete!");
}
}
}
OutputStream out = new FileOutputStream("/tmp/driveFile.jpg");
DriveFiles.Get request = drive.files().get(fileId);
request.getMediaHttpDownloader().setProgressListener(new CustomProgressListener());
request.executeMediaAndDownloadTo(out);
นอกจากนี้ คุณยังใช้ฟีเจอร์นี้โดยไม่มีไลบรารีที่สร้างขึ้นเฉพาะบริการได้ด้วย มีตัวอย่างดังต่อไปนี้
OutputStream out = new FileOutputStream("/tmp/Test.jpg");
MediaHttpDownloader downloader = new MediaHttpDownloader(transport, httpRequestInitializer);
downloader.setProgressListener(new CustomProgressListener());
downloader.download(requestUrl, out);
การดาวน์โหลดสื่อโดยตรง
ระบบจะเปิดใช้การดาวน์โหลดสื่อแบบกลับมาทำงานอีกครั้งโดยค่าเริ่มต้น แต่คุณปิดใช้และใช้การดาวน์โหลดสื่อโดยตรงแทนได้ เช่น หากกำลังดาวน์โหลดไฟล์ขนาดเล็ก เราได้นำการดาวน์โหลดสื่อโดยตรงมาใช้ในไลบรารีของไคลเอ็นต์ Google API สำหรับ Java เวอร์ชัน 1.9.0-beta
การดาวน์โหลดสื่อโดยตรงจะดาวน์โหลดเนื้อหาสื่อทั้งหมดในคำขอ HTTP รายการเดียว ซึ่งตรงข้ามกับโปรโตคอลการดาวน์โหลดสื่อที่กลับมาทำงานอีกครั้ง ซึ่งจะดาวน์โหลดในหลายคำขอได้ การดาวน์โหลดโดยตรงจะช่วยลดจำนวนคำขอ HTTP แต่เพิ่มโอกาสในการล้มเหลว (เช่น การเชื่อมต่อล้มเหลว) ที่อาจเกิดขึ้นกับการดาวน์โหลดขนาดใหญ่
การใช้งานจะเหมือนกับที่อธิบายข้างต้น พร้อมด้วยการเรียกที่บอกให้ MediaHttpDownloader ทำการดาวน์โหลดโดยตรง ดังต่อไปนี้
mediaHttpDownloader.setDirectDownloadEnabled(true);