بارگذاری مستقیم و قابل ازسرگیری رسانه ها

این سند نحوه استفاده از آپلودهای رسانه ای مستقیم و قابل ازسرگیری با Google API Client Library برای جاوا را توضیح می دهد.

بارگذاری مجدد رسانه

هنگامی که یک فایل رسانه ای بزرگ را روی یک سرور آپلود می کنید، از بارگذاری مجدد رسانه ای برای ارسال قطعه به تکه فایل استفاده کنید. کتابخانه‌های Google API ایجاد شده حاوی روش‌های راحت برای تعامل با آپلود رسانه‌ای قابل ازسرگیری هستند.

پروتکل بارگذاری رسانه قابل ازسرگیری مشابه پروتکل بارگذاری رسانه قابل ازسرگیری است که در اسناد Google Drive API توضیح داده شده است.

طراحی پروتکل

نمودار توالی زیر نشان می دهد که پروتکل بارگذاری مجدد رسانه چگونه کار می کند:
نمودار توالی نشان می دهد که چگونه درخواست ها و پاسخ ها بین مشتری و سرور حرکت می کنند.

جزئیات پیاده سازی

کلاس های اصلی مورد علاقه MediaHttpUploader و MediaHttpProgressListener هستند.

اگر روش‌های موجود در کتابخانه‌های تولید شده خاص سرویس حاوی پارامتر mediaUpload در سند Discovery باشند، یک روش راحت برای این روش‌ها ایجاد می‌شود که یک InputStreamContent را به عنوان پارامتر می‌گیرد. (برای اطلاعات بیشتر در مورد استفاده از آپلود رسانه با سرویس Google APIs Discovery، به آپلود رسانه مراجعه کنید.)

به عنوان مثال، روش 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); }

آپلود مستقیم رسانه

بارگذاری مجدد رسانه به طور پیش فرض فعال است، اما می توانید آن را غیرفعال کنید و به جای آن از آپلود مستقیم رسانه استفاده کنید، به عنوان مثال اگر در حال آپلود یک فایل کوچک هستید. آپلود مستقیم رسانه در نسخه 1.9.0 بتای Google API Client Library برای جاوا معرفی شد.

آپلود مستقیم رسانه، کل فایل را در یک درخواست HTTP آپلود می کند، برخلاف پروتکل بارگذاری مجدد رسانه ای که فایل را در چندین درخواست آپلود می کند. انجام آپلود مستقیم تعداد درخواست‌های HTTP را کاهش می‌دهد، اما احتمال خرابی‌ها (مانند خرابی اتصال) را افزایش می‌دهد که می‌تواند با آپلودهای بزرگ اتفاق بیفتد.

استفاده برای آپلود مستقیم رسانه همان چیزی است که در بالا برای بارگذاری مجدد رسانه توضیح داده شد، به علاوه تماس زیر که به MediaHttpUloader می‌گوید فقط آپلود مستقیم انجام دهد:

mediaHttpUploader.setDirectUploadEnabled(true);