ফাইল ডেটা আপলোড করুন

গুগল ড্রাইভ এপিআই আপনাকে কোনো File তৈরি বা আপডেট করার সময় ফাইলের ডেটা আপলোড করার সুযোগ দেয়। ফোল্ডারের মতো শুধুমাত্র মেটাডেটা-যুক্ত ফাইল কীভাবে তৈরি করতে হয়, সে সম্পর্কে জানতে ‘শুধুমাত্র মেটাডেটা-যুক্ত ফাইল তৈরি করুন’ দেখুন।

আপনি তিন ধরনের আপলোড করতে পারেন:

  • সাধারণ আপলোড ( uploadType=media ) : মেটাডেটা সরবরাহ না করে একটি ছোট মিডিয়া ফাইল (৫ এমবি বা তার কম) স্থানান্তর করতে এই আপলোড টাইপটি ব্যবহার করুন। সাধারণ আপলোড করার জন্য, "একটি সাধারণ আপলোড সম্পাদন করুন" দেখুন।

  • মাল্টিপার্ট আপলোড ( uploadType=multipart ) : "একটি ছোট ফাইল (৫ এমবি বা তার কম) এবং ফাইলটির বর্ণনা দেওয়া মেটাডেটা একটিমাত্র অনুরোধে স্থানান্তর করতে এই আপলোড টাইপটি ব্যবহার করুন। মাল্টিপার্ট আপলোড করার জন্য, ' পারফর্ম এ মাল্টিপার্ট আপলোড' দেখুন।"

  • রিজিউমেবল আপলোড ( uploadType=resumable ) : বড় ফাইল (৫ মেগাবাইটের বেশি) এবং যখন নেটওয়ার্ক বিঘ্নিত হওয়ার সম্ভাবনা বেশি থাকে, যেমন মোবাইল অ্যাপ থেকে ফাইল তৈরি করার সময়, এই আপলোড টাইপটি ব্যবহার করুন। বেশিরভাগ অ্যাপ্লিকেশনের জন্যও রিজিউমেবল আপলোড একটি ভালো বিকল্প, কারণ এটি ছোট ফাইলের ক্ষেত্রেও কাজ করে এবং প্রতি আপলোডে মাত্র একটি অতিরিক্ত HTTP রিকোয়েস্টের মতো ন্যূনতম খরচে এটি সম্ভব হয়। রিজিউমেবল আপলোড করার জন্য, "Perform a resumable upload" অংশটি দেখুন।

গুগল এপিআই ক্লায়েন্ট লাইব্রেরিগুলোতে এই ধরনের আপলোডগুলোর মধ্যে অন্তত একটি বাস্তবায়ন করা আছে। প্রতিটি ধরন কীভাবে ব্যবহার করতে হয় সে সম্পর্কে অতিরিক্ত তথ্যের জন্য ক্লায়েন্ট লাইব্রেরির ডকুমেন্টেশন দেখুন।

PATCH বনাম PUT ব্যবহার করুন

পুনরায় মনে করিয়ে দেওয়া ভালো যে, HTTP ভার্ব PATCH একটি ফাইল রিসোর্সের আংশিক আপডেট সমর্থন করে, যেখানে HTTP ভার্ব PUT সম্পূর্ণ রিসোর্স প্রতিস্থাপন সমর্থন করে। উল্লেখ্য যে, বিদ্যমান কোনো রিসোর্সে নতুন ফিল্ড যোগ করার সময় PUT ব্রেকিং চেঞ্জ আনতে পারে।

ফাইল রিসোর্স আপলোড করার সময় নিম্নলিখিত নির্দেশিকাগুলো অনুসরণ করুন:

  • পুনরায় শুরুযোগ্য আপলোডের প্রাথমিক অনুরোধের জন্য অথবা সাধারণ বা বহু-অংশযুক্ত আপলোডের একমাত্র অনুরোধের জন্য, এপিআই রেফারেন্সে নথিভুক্ত HTTP ভার্বটি ব্যবহার করুন।
  • একবার অনুরোধ শুরু হয়ে গেলে, পুনরায় শুরুযোগ্য আপলোডের জন্য পরবর্তী সমস্ত অনুরোধের ক্ষেত্রে PUT ব্যবহার করুন। কোন মেথড কল করা হচ্ছে তা নির্বিশেষে, এই অনুরোধগুলো কন্টেন্ট আপলোড করতে থাকে।

একটি সাধারণ আপলোড সম্পাদন করুন

সাধারণ আপলোড করার জন্য, files রিসোর্সের create মেথডে uploadType=media ব্যবহার করুন।

নিচে একটি সাধারণ আপলোড করার পদ্ধতি দেখানো হলো:

HTTP

  1. uploadType=media কোয়েরি প্যারামিটার ব্যবহার করে মেথডটির `/upload` URI-তে একটি POST রিকোয়েস্ট তৈরি করুন।

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=media

  2. ফাইলটির ডেটা রিকোয়েস্ট বডিতে যোগ করুন।

  3. এই HTTP হেডারগুলো যোগ করুন:

    • Content-Type . আপলোড করা হচ্ছে এমন অবজেক্টের MIME মিডিয়া টাইপে সেট করুন।
    • Content-Length . আপনি যত বাইট আপলোড করবেন, সেই সংখ্যায় এটি সেট করুন। আপনি যদি চাঙ্কড ট্রান্সফার এনকোডিং ব্যবহার করেন, তাহলে এই হেডারটির প্রয়োজন নেই।
  4. অনুরোধটি পাঠান। অনুরোধটি সফল হলে, সার্ভার ফাইলটির মেটাডেটা সহ HTTP 200 OK স্ট্যাটাস কোডটি ফেরত পাঠায়। {HTTP}

আপনি যখন একটি সাধারণ আপলোড করেন, তখন মৌলিক মেটাডেটা তৈরি হয় এবং ফাইল থেকে কিছু অ্যাট্রিবিউট, যেমন MIME টাইপ বা modifiedTime , অনুমান করা হয়। ছোট আকারের ফাইল থাকলে এবং ফাইলের মেটাডেটা গুরুত্বপূর্ণ না হলে আপনি সাধারণ আপলোড ব্যবহার করতে পারেন।

একাধিক অংশ আপলোড করুন

একটি মাল্টিপার্ট আপলোড রিকোয়েস্ট আপনাকে একই অনুরোধে মেটাডেটা এবং ডেটা আপলোড করার সুযোগ দেয়। যদি আপনার পাঠানো ডেটা এতটাই ছোট হয় যে সংযোগ বিচ্ছিন্ন হয়ে গেলেও তা সম্পূর্ণভাবে পুনরায় আপলোড করা সম্ভব, তবে এই বিকল্পটি ব্যবহার করুন।

একাধিক অংশে আপলোড করার জন্য, files রিসোর্সের create মেথডে uploadType=multipart ব্যবহার করুন।

নিচে দেখানো হলো কীভাবে একটি মাল্টিপার্ট আপলোড করতে হয়:

জাভা

drive/snippets/drive_v3/src/main/java/UploadBasic.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate use of Drive insert file API */
public class UploadBasic {

  /**
   * Upload new file.
   *
   * @return Inserted file metadata if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadBasic() throws IOException {
    // Load pre-authorized user credentials from the environment.
    // TODO(developer) - See https://developers.google.com/identity for
    // guides on implementing OAuth2 for your application.
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();
    // Upload file photo.jpg on drive.
    File fileMetadata = new File();
    fileMetadata.setName("photo.jpg");
    // File's content.
    java.io.File filePath = new java.io.File("files/photo.jpg");
    // Specify media type and file-path for file.
    FileContent mediaContent = new FileContent("image/jpeg", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to upload file: " + e.getDetails());
      throw e;
    }
  }
}

পাইথন

drive/snippets/drive-v3/file_snippet/upload_basic.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_basic():
  """Insert new file.
  Returns : Id's of the file uploaded

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    file_metadata = {"name": "download.jpeg"}
    media = MediaFileUpload("download.jpeg", mimetype="image/jpeg")
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File ID: {file.get("id")}')

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.get("id")


if __name__ == "__main__":
  upload_basic()

নোড.জেএস

drive/snippets/drive_v3/file_snippets/upload_basic.js
import fs from 'node:fs';
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Uploads a file to Google Drive.
 * @return {Promise<string|null|undefined>} The ID of the uploaded file.
 */
async function uploadBasic() {
  // Authenticate with Google and get an authorized client.
  // TODO (developer): Use an appropriate auth mechanism for your app.
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Drive API client (v3).
  const service = google.drive({version: 'v3', auth});

  // The request body for the file to be uploaded.
  const requestBody = {
    name: 'photo.jpg',
    fields: 'id',
  };

  // The media content to be uploaded.
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };

  // Upload the file.
  const file = await service.files.create({
    requestBody,
    media,
  });

  // Print the ID of the uploaded file.
  console.log('File Id:', file.data.id);
  return file.data.id;
}

পিএইচপি

drive/snippets/drive_v3/src/DriveUploadBasic.php
<?php
use Google\Client;
use Google\Service\Drive;
# TODO - PHP client currently chokes on fetching start page token
function uploadBasic()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
        'name' => 'photo.jpg'));
        $content = file_get_contents('../files/photo.jpg');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'image/jpeg',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    } 

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/UploadBasic.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive insert file API
    public class UploadBasic
    {
        /// <summary>
        /// Upload new file.
        /// </summary>
        /// <param name="filePath">Image path to upload.</param>
        /// <returns>Inserted file metadata if successful, null otherwise.</returns>
        public static string DriveUploadBasic(string filePath)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                // Upload file photo.jpg on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "photo.jpg"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new file on drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "image/jpeg");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

HTTP

  1. uploadType=multipart কোয়েরি প্যারামিটার ব্যবহার করে মেথডটির `/upload` URI-তে একটি POST রিকোয়েস্ট তৈরি করুন:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart

  2. অনুরোধের মূল অংশ তৈরি করুন। RFC 2387 মাল্টিপার্ট/রিলেটেড কন্টেন্ট টাইপ অনুযায়ী মূল অংশটি ফরম্যাট করুন, যেটিতে দুটি অংশ রয়েছে:

    • মেটাডেটা। মেটাডেটা অবশ্যই প্রথমে আসতে হবে এবং এর Content-Type হেডারটি application/json; charset=UTF-8 সেট করা থাকতে হবে। ফাইলটির মেটাডেটা JSON ফরম্যাটে যোগ করুন।
    • মিডিয়া। মিডিয়াটি অবশ্যই দ্বিতীয় স্থানে থাকতে হবে এবং এর একটি Content-Type হেডার থাকতে হবে যা যেকোনো MIME টাইপের হতে পারে। ফাইলটির ডেটা মিডিয়া অংশে যোগ করুন।

    প্রতিটি অংশকে দুটি হাইফেনের পরে একটি সীমানা নির্দেশক দিয়ে চিহ্নিত করুন। এছাড়াও, শেষ সীমানা নির্দেশকটির পরে দুটি হাইফেন যোগ করুন।

  3. এই শীর্ষ-স্তরের HTTP হেডারগুলি যোগ করুন:

    • Content-Type multipart/related এ সেট করুন এবং রিকোয়েস্টের বিভিন্ন অংশ শনাক্ত করতে ব্যবহৃত বাউন্ডারি স্ট্রিংটি অন্তর্ভুক্ত করুন। উদাহরণস্বরূপ: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length . অনুরোধের মূল অংশে থাকা মোট বাইট সংখ্যায় সেট করুন।
  4. অনুরোধটি পাঠান।

সংশ্লিষ্ট ডেটা ছাড়া শুধুমাত্র মেটাডেটা অংশ তৈরি বা আপডেট করতে, স্ট্যান্ডার্ড রিসোর্স এন্ডপয়েন্ট: https://www.googleapis.com/drive/v3/files এ একটি POST বা PATCH রিকোয়েস্ট পাঠান। রিকোয়েস্টটি সফল হলে, সার্ভার ফাইলটির মেটাডেটাসহ HTTP 200 OK স্ট্যাটাস কোড ফেরত পাঠায়।

ফাইল তৈরি করার সময়, ফাইলের name ফিল্ডে একটি ফাইল এক্সটেনশন উল্লেখ করতে হবে। উদাহরণস্বরূপ, একটি ফটো JPEG ফাইল তৈরি করার সময়, আপনি মেটাডেটাতে "name": "photo.jpg" এর মতো কিছু উল্লেখ করতে পারেন। পরবর্তীতে get মেথড কল করলে fileExtension নামক একটি রিড-অনলি প্রপার্টি রিটার্ন হয়, যেটিতে name ফিল্ডে প্রথমে উল্লেখ করা এক্সটেনশনটি থাকে।

পুনরায় শুরুযোগ্য আপলোড সম্পাদন করুন

যোগাযোগ ব্যর্থতার কারণে ডেটা প্রবাহ বাধাগ্রস্ত হলে, রিস্যুমেবল আপলোড আপনাকে আপলোড প্রক্রিয়াটি পুনরায় শুরু করার সুযোগ দেয়। যেহেতু বড় ফাইল আপলোড একেবারে শুরু থেকে আবার করতে হয় না, তাই নেটওয়ার্ক ব্যর্থতার ক্ষেত্রে রিস্যুমেবল আপলোড আপনার ব্যান্ডউইথের ব্যবহারও কমাতে পারে।

যখন আপনার ফাইলের আকারে অনেক তারতম্য হতে পারে অথবা অনুরোধের জন্য একটি নির্দিষ্ট সময়সীমা থাকে (যেমন মোবাইল ওএস ব্যাকগ্রাউন্ড টাস্ক এবং নির্দিষ্ট অ্যাপ ইঞ্জিন অনুরোধ), তখন রিস্যুমেবল আপলোড কার্যকর হয়। এছাড়াও, আপনি যখন একটি আপলোড অগ্রগতি বার দেখাতে চান, তখনও রিস্যুমেবল আপলোড ব্যবহার করতে পারেন।

পুনরায় শুরুযোগ্য আপলোড কয়েকটি প্রধান ধাপ নিয়ে গঠিত:

  1. প্রাথমিক অনুরোধটি পাঠান এবং পুনরায় শুরুযোগ্য সেশন ইউআরআইটি পুনরুদ্ধার করুন।
  2. ডেটা আপলোড করুন এবং আপলোডের অবস্থা পর্যবেক্ষণ করুন।
  3. (ঐচ্ছিক) আপলোড বাধাগ্রস্ত হলে, আপলোড পুনরায় শুরু করুন।

প্রাথমিক অনুরোধ পাঠান

পুনরায় শুরুযোগ্য আপলোড শুরু করতে, files রিসোর্সের create মেথডে uploadType=resumable ব্যবহার করুন।

HTTP

  1. uploadType=resumable কোয়েরি প্যারামিটার ব্যবহার করে মেথডটির `/upload` URI-তে একটি POST রিকোয়েস্ট তৈরি করুন:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable

    সেশন শুরুর অনুরোধটি সফল হলে, রেসপন্সে একটি 200 OK HTTP স্ট্যাটাস কোড অন্তর্ভুক্ত থাকে। এছাড়াও, এতে একটি Location হেডার থাকে যা পুনরায় শুরুযোগ্য সেশন URI নির্দিষ্ট করে:

    HTTP/1.1 200 OK
    Location: https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=xa298sd_sdlkj2
    Content-Length: 0
    

    পুনরায় শুরুযোগ্য সেশন URI-টি সংরক্ষণ করুন, যাতে আপনি ফাইলের ডেটা আপলোড করতে এবং আপলোডের অবস্থা জানতে পারেন। একটি পুনরায় শুরুযোগ্য সেশন URI এক সপ্তাহ পর মেয়াদোত্তীর্ণ হয়ে যায়।

  2. ফাইলটির মেটাডেটা থাকলে, তা JSON ফরম্যাটে রিকোয়েস্ট বডিতে যোগ করুন। অন্যথায়, রিকোয়েস্ট বডি খালি রাখুন।

  3. এই HTTP হেডারগুলো যোগ করুন:

    • X-Upload-Content-Type . ঐচ্ছিক। ফাইল ডেটার MIME টাইপে সেট করুন, যা পরবর্তী অনুরোধগুলিতে স্থানান্তরিত হয়। যদি মেটাডেটাতে বা এই হেডারের মাধ্যমে ডেটার MIME টাইপ নির্দিষ্ট করা না থাকে, তাহলে অবজেক্টটি application/octet-stream.
    • X-Upload-Content-Length (ঐচ্ছিক)। পরবর্তী অনুরোধগুলিতে স্থানান্তরিত ফাইল ডেটার বাইট সংখ্যা হিসাবে এটি সেট করুন।
    • Content-Type . ফাইলটির মেটাডেটা থাকলে এটি আবশ্যক। application/json; charset=UTF-8 -এ সেট করুন।
    • Content-Length . আবশ্যক, যদি না আপনি chunked transfer encoding ব্যবহার করেন। এই প্রাথমিক অনুরোধের বডিতে থাকা বাইটের সংখ্যায় এটি সেট করুন।
  4. অনুরোধটি পাঠান। সেশন শুরুর অনুরোধটি সফল হলে, রেসপন্সে একটি 200 OK HTTP স্ট্যাটাস কোড অন্তর্ভুক্ত থাকে। এছাড়াও, রেসপন্সে একটি Location হেডার থাকে যা রিস্যুমেবল সেশন URI নির্দিষ্ট করে। ফাইল ডেটা আপলোড করতে এবং আপলোডের স্ট্যাটাস জানতে রিস্যুমেবল সেশন URI ব্যবহার করুন। একটি রিস্যুমেবল সেশন URI এক সপ্তাহ পর মেয়াদোত্তীর্ণ হয়ে যায়।

  5. পুনরায় শুরুযোগ্য সেশন ইউআরএলটি কপি করে সংরক্ষণ করুন।

  6. কন্টেন্ট আপলোড করতে থাকুন।

বিষয়বস্তু আপলোড করুন

পুনরায় শুরুযোগ্য সেশন সহ একটি ফাইল আপলোড করার দুটি উপায় আছে:

  • একক অনুরোধে কন্টেন্ট আপলোড করুন : এই পদ্ধতিটি ব্যবহার করুন যখন ফাইলটি একটি অনুরোধেই আপলোড করা যায়, যদি কোনো একক অনুরোধের জন্য কোনো নির্দিষ্ট সময়সীমা না থাকে, অথবা আপনার আপলোডের অগ্রগতি নির্দেশক দেখানোর প্রয়োজন না হয়। এই পদ্ধতিটিই সর্বোত্তম, কারণ এতে কম অনুরোধের প্রয়োজন হয় এবং এর ফলে উন্নত পারফরম্যান্স পাওয়া যায়।
  • কন্টেন্ট একাধিক খণ্ডে আপলোড করুন : যদি কোনো একক অনুরোধে স্থানান্তরিত ডেটার পরিমাণ কমাতেই হয়, তবে এই পদ্ধতিটি ব্যবহার করুন। যখন প্রতিটি অনুরোধের জন্য একটি নির্দিষ্ট সময়সীমা থাকে, তখন আপনার স্থানান্তরিত ডেটা কমানোর প্রয়োজন হতে পারে, যেমনটা অ্যাপ ইঞ্জিন অনুরোধের কিছু নির্দিষ্ট শ্রেণীর ক্ষেত্রে হতে পারে। আপলোডের অগ্রগতি দেখানোর জন্য যদি আপনাকে একটি কাস্টমাইজড ইন্ডিকেটর প্রদান করতেই হয়, তাহলেও এই পদ্ধতিটি কার্যকর।

HTTP - একক অনুরোধ

  1. পুনরায় শুরুযোগ্য সেশন ইউআরআই-তে একটি PUT অনুরোধ তৈরি করুন।
  2. ফাইলটির ডেটা রিকোয়েস্ট বডিতে যোগ করুন।
  3. একটি Content-Length HTTP হেডার যোগ করুন, যা ফাইলের বাইটের সংখ্যার সমান হবে।
  4. অনুরোধটি পাঠান। যদি আপলোড অনুরোধটি বাধাগ্রস্ত হয়, অথবা যদি আপনি একটি 5xx প্রতিক্রিয়া পান, তাহলে "বাধাগ্রস্ত আপলোড পুনরায় শুরু করুন" অংশে বর্ণিত পদ্ধতি অনুসরণ করুন।

HTTP - একাধিক অনুরোধ

  1. পুনরায় শুরুযোগ্য সেশন ইউআরআই-তে একটি PUT অনুরোধ তৈরি করুন।

  2. চাঙ্কের ডেটা রিকোয়েস্ট বডিতে যোগ করুন। আপলোড সম্পন্নকারী শেষ চাঙ্কটি ছাড়া, বাকি চাঙ্কগুলো ২৫৬ কিলোবাইট (২৫৬ x ১০২৪ বাইট) আকারের গুণিতকে তৈরি করুন। চাঙ্কের আকার যথাসম্ভব বড় রাখুন, যাতে আপলোডটি কার্যকর হয়।

  3. এই HTTP হেডারগুলো যোগ করুন:

    • Content-Length . বর্তমান চাঙ্কের বাইট সংখ্যায় সেট করুন।
    • Content-Range . আপনি ফাইলের কোন বাইটগুলো আপলোড করছেন তা দেখানোর জন্য এটি সেট করুন। উদাহরণস্বরূপ, Content-Range: bytes 0-524287/2000000 দেখাচ্ছে যে আপনি একটি ২০,০০,০০০ বাইটের ফাইলের প্রথম ৫,২৪,২৮৮ বাইট (২৫৬ x ১০২৪ x ২) আপলোড করছেন।
  4. অনুরোধটি পাঠান এবং প্রতিক্রিয়াটি প্রক্রিয়া করুন। যদি আপলোড অনুরোধটি বাধাগ্রস্ত হয়, অথবা যদি আপনি একটি 5xx প্রতিক্রিয়া পান, তাহলে 'একটি বাধাগ্রস্ত আপলোড পুনরায় শুরু করুন' অংশে বর্ণিত পদ্ধতি অনুসরণ করুন।

  5. ফাইলে অবশিষ্ট থাকা প্রতিটি চাঙ্কের জন্য ১ থেকে ৪ নম্বর ধাপগুলো পুনরাবৃত্তি করুন। পরবর্তী চাঙ্কটি কোথা থেকে শুরু করতে হবে তা নির্ধারণ করতে রেসপন্সের Range হেডারটি ব্যবহার করুন। আগের অনুরোধে পাঠানো সমস্ত বাইট সার্ভার পেয়েছে বলে ধরে নেবেন না।

সম্পূর্ণ ফাইল আপলোড সম্পন্ন হলে, আপনি রিসোর্সটির সাথে সম্পর্কিত মেটাডেটাসহ একটি 200 OK বা 201 Created রেসপন্স পাবেন।

বাধাগ্রস্ত আপলোড পুনরায় শুরু করুন

যদি কোনো প্রতিক্রিয়া পাওয়ার আগেই আপলোড অনুরোধটি বন্ধ হয়ে যায়, অথবা যদি আপনি 503 Service Unavailable প্রতিক্রিয়া পান, তাহলে আপনাকে অবশ্যই বাধাগ্রস্ত আপলোডটি পুনরায় শুরু করতে হবে।

HTTP

  1. আপলোড স্ট্যাটাস জানতে, রিস্যুমেবল সেশন ইউআরআই-তে একটি খালি PUT রিকোয়েস্ট তৈরি করুন।

  2. ফাইলের বর্তমান অবস্থান অজানা বোঝাতে একটি Content-Range হেডার যোগ করুন। উদাহরণস্বরূপ, যদি আপনার ফাইলের মোট দৈর্ঘ্য ২,০০০,০০০ বাইট হয়, তাহলে Content-Range কে */2000000 সেট করুন। যদি আপনি ফাইলের সম্পূর্ণ আকার না জানেন, তাহলে Content-Range কে */* সেট করুন।

  3. অনুরোধটি পাঠান।

  4. প্রতিক্রিয়াটি প্রক্রিয়া করুন:

    • 200 OK বা 201 Created প্রতিক্রিয়া নির্দেশ করে যে আপলোড সম্পন্ন হয়েছে এবং আর কোনো পদক্ষেপের প্রয়োজন নেই।
    • 308 Resume Incomplete প্রতিক্রিয়াটি নির্দেশ করে যে আপনাকে অবশ্যই ফাইলটি আপলোড করা চালিয়ে যেতে হবে।
    • একটি 404 Not Found প্রতিক্রিয়া নির্দেশ করে যে আপলোড সেশনের মেয়াদ শেষ হয়ে গেছে এবং আপলোডটি শুরু থেকে পুনরায় শুরু করতে হবে।
  5. যদি আপনি একটি 308 Resume Incomplete রেসপন্স পেয়ে থাকেন, তাহলে সার্ভার কোন বাইটগুলো পেয়েছে তা নির্ধারণ করতে রেসপন্সটির Range হেডারটি বিশ্লেষণ করুন। যদি রেসপন্সটিতে কোনো Range হেডার না থাকে, তার মানে কোনো বাইটই পাওয়া যায়নি। উদাহরণস্বরূপ, bytes=0-42 এর একটি Range হেডার নির্দেশ করে যে ফাইলটির প্রথম ৪৩ বাইট পাওয়া গেছে এবং আপলোড করার জন্য পরবর্তী অংশটি ৪৪ নম্বর বাইট থেকে শুরু হবে।

  6. এখন যেহেতু আপনি জানেন কোথা থেকে আপলোড আবার শুরু করতে হবে, তাই পরবর্তী বাইট থেকে ফাইলটি আপলোড করা চালিয়ে যান। ফাইলের কোন অংশটি পাঠাচ্ছেন তা বোঝানোর জন্য একটি Content-Range হেডার অন্তর্ভুক্ত করুন। উদাহরণস্বরূপ, Content-Range: bytes 43-1999999 নির্দেশ করে যে আপনি ৪৪ থেকে ২,০০০,০০০ বাইট পর্যন্ত পাঠাচ্ছেন।

মিডিয়া আপলোড ত্রুটিগুলি পরিচালনা করুন

মিডিয়া আপলোড করার সময় ত্রুটি মোকাবেলার জন্য এই সর্বোত্তম পদ্ধতিগুলো অনুসরণ করুন:

  • 5xx ত্রুটির ক্ষেত্রে, সংযোগ বিচ্ছিন্ন হওয়ার কারণে ব্যর্থ হওয়া আপলোডগুলি পুনরায় শুরু করুন বা আবার চেষ্টা করুন। 5xx ত্রুটিগুলি কীভাবে সামলাতে হয় সে সম্পর্কে আরও তথ্যের জন্য, 500, 502, 503, 504 ত্রুটিগুলি দেখুন।
  • 403 rate limit ত্রুটির ক্ষেত্রে, আপলোডটি পুনরায় চেষ্টা করুন। 403 rate limit ত্রুটি কীভাবে মোকাবিলা করতে হয় সে সম্পর্কে আরও তথ্যের জন্য, 403 error: rateLimitExceeded দেখুন।
  • পুনরায় শুরুযোগ্য আপলোডের সময় যেকোনো 4xx ত্রুটির ( 403 সহ) ক্ষেত্রে, আপলোডটি পুনরায় শুরু করুন। এই ত্রুটিগুলি নির্দেশ করে যে আপলোড সেশনের মেয়াদ শেষ হয়ে গেছে এবং একটি নতুন সেশন URI-এর জন্য অনুরোধ করে এটি পুনরায় শুরু করতে হবে। এক সপ্তাহ নিষ্ক্রিয় থাকার পরেও আপলোড সেশনের মেয়াদ শেষ হয়ে যায়।

গুগল ডকস-এ আমদানি করার প্রকারভেদ

ড্রাইভে কোনো ফাইল তৈরি করার সময়, আপনি হয়তো ফাইলটিকে গুগল ওয়ার্কস্পেসের কোনো ফাইল টাইপে, যেমন গুগল ডক্স বা শীটসে, রূপান্তর করতে চাইতে পারেন। উদাহরণস্বরূপ, হয়তো আপনি আপনার পছন্দের ওয়ার্ড প্রসেসরের কোনো ডকুমেন্টকে ডক্স-এ রূপান্তর করে এর ফিচারগুলোর সুবিধা নিতে চান।

কোনো ফাইলকে একটি নির্দিষ্ট গুগল ওয়ার্কস্পেস ফাইল টাইপে রূপান্তর করতে, ফাইলটি তৈরি করার সময় গুগল ওয়ার্কস্পেস mimeType উল্লেখ করুন।

নিচে দেখানো হলো কীভাবে একটি CSV ফাইলকে গুগল ওয়ার্কস্পেস শীটে রূপান্তর করতে হয়:

জাভা

drive/snippets/drive_v3/src/main/java/UploadWithConversion.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate Drive's upload with conversion use-case. */
public class UploadWithConversion {

  /**
   * Upload file with conversion.
   *
   * @return Inserted file id if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadWithConversion() throws IOException {
    // Load pre-authorized user credentials from the environment.
    // TODO(developer) - See https://developers.google.com/identity for
    // guides on implementing OAuth2 for your application.
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    // File's metadata.
    File fileMetadata = new File();
    fileMetadata.setName("My Report");
    fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet");

    java.io.File filePath = new java.io.File("files/report.csv");
    FileContent mediaContent = new FileContent("text/csv", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to move file: " + e.getDetails());
      throw e;
    }
  }
}

পাইথন

drive/snippets/drive-v3/file_snippet/upload_with_conversion.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_with_conversion():
  """Upload file with conversion
  Returns: ID of the file uploaded

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    file_metadata = {
        "name": "My Report",
        "mimeType": "application/vnd.google-apps.spreadsheet",
    }
    media = MediaFileUpload("report.csv", mimetype="text/csv", resumable=True)
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File with ID: "{file.get("id")}" has been uploaded.')

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.get("id")


if __name__ == "__main__":
  upload_with_conversion()

নোড.জেএস

drive/snippets/drive_v3/file_snippets/upload_with_conversion.js
import fs from 'node:fs';
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Uploads a file to Google Drive and converts it to a Google Sheet.
 * @return {Promise<string|null|undefined>} The ID of the uploaded file.
 */
async function uploadWithConversion() {
  // Authenticate with Google and get an authorized client.
  // TODO (developer): Use an appropriate auth mechanism for your app.
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Drive API client (v3).
  const service = google.drive({version: 'v3', auth});

  // The metadata for the file to be uploaded and converted.
  const fileMetadata = {
    name: 'My Report',
    // The MIME type to convert the file to.
    mimeType: 'application/vnd.google-apps.spreadsheet',
  };

  // The media content to be uploaded.
  const media = {
    mimeType: 'text/csv',
    body: fs.createReadStream('files/report.csv'),
  };

  // Upload the file with conversion.
  const file = await service.files.create({
    requestBody: fileMetadata,
    media,
    fields: 'id',
  });

  // Print the ID of the uploaded file.
  console.log('File Id:', file.data.id);
  return file.data.id;
}

পিএইচপি

drive/snippets/drive_v3/src/DriveUploadWithConversion.php
<?php
use Google\Client;
use Google\Service\Drive;
function uploadWithConversion()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
            'name' => 'My Report',
            'mimeType' => 'application/vnd.google-apps.spreadsheet'));
        $content = file_get_contents('../files/report.csv');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'text/csv',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/UploadWithConversion.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate Drive's upload with conversion use-case.
    public class UploadWithConversion
    {
        /// <summary>
        /// Upload file with conversion.
        /// </summary>
        /// <param name="filePath">Id of the spreadsheet file.</param>
        /// <returns>Inserted file id if successful, null otherwise.</returns>
        public static string DriveUploadWithConversion(string filePath)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                // Upload file My Report on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "My Report",
                    MimeType = "application/vnd.google-apps.spreadsheet"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "text/csv");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

কোনো রূপান্তর উপলব্ধ আছে কিনা তা দেখতে, ফাইলটি তৈরি করার আগে about ' রিসোর্সের importFormats ফিল্ডটি পরীক্ষা করুন। সমর্থিত রূপান্তরগুলি এই অ্যারেতে গতিশীলভাবে উপলব্ধ হয়। কিছু সাধারণ ইম্পোর্ট ফরম্যাট হলো:

থেকে প্রতি
মাইক্রোসফট ওয়ার্ড, ওপেনডকুমেন্ট টেক্সট, এইচটিএমএল, আরটিএফ, প্লেইন টেক্সট গুগল ডক্স
মাইক্রোসফট এক্সেল, ওপেনডকুমেন্ট স্প্রেডশিট, সিএসভি, টিএসভি, প্লেইন টেক্সট গুগল শীটস
মাইক্রোসফট পাওয়ারপয়েন্ট, ওপেনডকুমেন্ট প্রেজেন্টেশন গুগল স্লাইডস
JPEG, PNG, GIF, BMP, PDF গুগল ডক্স (ডক-এর মধ্যে ছবিটি এমবেড করে)
সাধারণ টেক্সট (বিশেষ MIME টাইপ), JSON গুগল অ্যাপস স্ক্রিপ্ট

যখন আপনি কোনো Docs, Sheets বা Slides ফাইল update অনুরোধের সময় মিডিয়া আপলোড ও রূপান্তর করেন, তখন ডকুমেন্টটির সম্পূর্ণ বিষয়বস্তু প্রতিস্থাপিত হয়ে যায়।

যখন আপনি কোনো ছবিকে ডকস-এ রূপান্তর করেন, তখন ড্রাইভ ছবিটিকে টেক্সটে রূপান্তর করার জন্য অপটিক্যাল ক্যারেক্টার রিকগনিশন (OCR) ব্যবহার করে। আপনি ocrLanguage প্যারামিটারে প্রযোজ্য BCP 47 ল্যাঙ্গুয়েজ কোড উল্লেখ করে OCR অ্যালগরিদমের মান উন্নত করতে পারেন। নিষ্কাশিত টেক্সটটি ডকুমেন্টে এমবেড করা ছবির পাশাপাশি প্রদর্শিত হয়।

ফাইল আপলোড করতে আগে থেকে তৈরি একটি আইডি ব্যবহার করুন।

ড্রাইভ এপিআই আপনাকে আগে থেকে তৈরি করা ফাইল আইডিগুলোর একটি তালিকা পেতে দেয়, যা রিসোর্স তৈরি, কপি এবং আপলোড করতে ব্যবহার করা যেতে পারে। আরও তথ্যের জন্য, আপনার ফাইলগুলোর সাথে ব্যবহার করার জন্য আইডি তৈরি করুন দেখুন।

অনির্দিষ্ট সার্ভার ত্রুটি বা টাইমআউট হলে আপনি আগে থেকে তৈরি করা আইডি ব্যবহার করে নিরাপদে আপলোড পুনরায় চেষ্টা করতে পারেন। ফাইল আপলোড সফল হলে, পরবর্তী চেষ্টাগুলোতে একটি 409 Conflict HTTP স্ট্যাটাস কোড প্রতিক্রিয়া আসে এবং কোনো ডুপ্লিকেট ফাইল তৈরি হয় না।

উল্লেখ্য যে, application/vnd.google-apps.drive-sdk এবং application/vnd.google-apps.folder MIME টাইপগুলো ছাড়া, গুগল ওয়ার্কস্পেস ফাইল তৈরির জন্য আগে থেকে তৈরি করা আইডি সমর্থিত নয়। একইভাবে, গুগল ওয়ার্কস্পেস ফাইল ফরম্যাটে রূপান্তরের উল্লেখ রয়েছে এমন আপলোডও সমর্থিত নয়।

অজানা ফাইল প্রকারের জন্য সূচীকরণযোগ্য পাঠ্য সংজ্ঞায়িত করুন

ব্যবহারকারীরা ড্রাইভ UI ব্যবহার করে ডকুমেন্টের বিষয়বস্তু খুঁজে নিতে পারেন। এছাড়াও, আপনি আপনার অ্যাপ থেকে বিষয়বস্তু অনুসন্ধান করার জন্য files রিসোর্সের list মেথড এবং fullText ফিল্ড ব্যবহার করতে পারেন। আরও তথ্যের জন্য, ফাইল ও ফোল্ডার অনুসন্ধান দেখুন।

ড্রাইভ ফাইলের ধরন শনাক্ত করতে পারলেই অনুসন্ধানের জন্য ডকুমেন্টগুলোকে স্বয়ংক্রিয়ভাবে ইন্ডেক্স করে, যার মধ্যে টেক্সট ডকুমেন্ট, পিডিএফ, টেক্সটসহ ছবি এবং অন্যান্য সাধারণ ধরনের ফাইল অন্তর্ভুক্ত। যদি আপনার অ্যাপ অন্য ধরনের ফাইল (যেমন ড্রয়িং, ভিডিও এবং শর্টকাট) সংরক্ষণ করে, তবে ফাইলের contentHints.indexableText ফিল্ডে ইন্ডেক্সযোগ্য টেক্সট সরবরাহ করে আপনি সেগুলোর খুঁজে পাওয়ার সম্ভাবনা উন্নত করতে পারেন।

ইনডেক্সযোগ্য টেক্সট সম্পর্কে আরও তথ্যের জন্য, ফাইল মেটাডেটা পরিচালনা দেখুন।