อัปโหลดข้อมูลไฟล์

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

การอัปโหลดที่คุณทำได้มี 3 ประเภท ดังนี้

  • การอัปโหลดแบบง่าย (uploadType=media): ใช้การอัปโหลดประเภทนี้เพื่อโอนไฟล์สื่อขนาดเล็ก (5 MB หรือน้อยกว่า) โดยไม่ต้องระบุข้อมูลเมตา หากต้องการทำการอัปโหลดแบบง่าย โปรดดูทำการอัปโหลดแบบง่าย

  • การอัปโหลดแบบหลายส่วน (uploadType=multipart): "ใช้การอัปโหลดประเภทนี้เพื่อโอนไฟล์ขนาดเล็ก (5 MB หรือน้อยกว่า) พร้อมกับข้อมูลเมตาที่อธิบายไฟล์ในคำขอเดียว หากต้องการอัปโหลดแบบหลายไฟล์ โปรดดูการอัปโหลดแบบหลายไฟล์

  • การอัปโหลดแบบดำเนินการต่อได้ (uploadType=resumable): ใช้การอัปโหลดประเภทนี้สำหรับไฟล์ขนาดใหญ่ (มากกว่า 5 MB) และเมื่อมีโอกาสสูงที่เครือข่ายจะหยุดชะงัก เช่น เมื่อสร้างไฟล์จากแอปบนอุปกรณ์เคลื่อนที่ การอัปโหลดแบบดำเนินการต่อได้ยังเป็นตัวเลือกที่ดีสำหรับแอปพลิเคชันส่วนใหญ่ด้วย เนื่องจากสามารถทำงานกับไฟล์ขนาดเล็กได้ด้วย โดยจะมีค่าใช้จ่ายเพิ่มเติมเพียงคําขอ HTTP 1 รายการต่อการอัปโหลด หากต้องการทำการอัปโหลดที่ดำเนินการต่อได้ โปรดดูทำการอัปโหลดที่ดำเนินการต่อได้

ไลบรารีของไคลเอ็นต์ Google API ใช้การอัปโหลดประเภทใดประเภทหนึ่งต่อไปนี้เป็นอย่างน้อย ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีใช้แต่ละประเภทได้ที่เอกสารประกอบเกี่ยวกับไลบรารีของไคลเอ็นต์

ใช้ PATCH เทียบกับ PUT

โปรดทราบว่าคําสั่ง HTTP PATCH รองรับการอัปเดตทรัพยากรไฟล์บางส่วน ส่วนคําสั่ง HTTP PUT รองรับการเปลี่ยนทรัพยากรทั้งหมด โปรดทราบว่า PUT อาจทำให้เกิดการเปลี่ยนแปลงที่ส่งผลเสียเมื่อเพิ่มฟิลด์ใหม่ลงในทรัพยากรที่มีอยู่

เมื่ออัปโหลดทรัพยากรไฟล์ ให้ใช้หลักเกณฑ์ต่อไปนี้

  • ใช้คํากริยา HTTP ที่ระบุไว้ในข้อมูลอ้างอิง API สําหรับคําขอเริ่มต้นของการอัปโหลดแบบเริ่มใหม่ได้ หรือสําหรับคําขอเดียวของการอัปโหลดแบบง่ายหรือแบบหลายส่วน
  • ใช้ PUT สำหรับคำขอการอัปโหลดแบบเริ่มใหม่ได้ทั้งหมดในภายหลังเมื่อคำขอเริ่มต้นแล้ว คำขอเหล่านี้จะอัปโหลดเนื้อหาไม่ว่าจะเรียกใช้เมธอดใดก็ตาม

อัปโหลดแบบง่าย

หากต้องการอัปโหลดแบบง่าย ให้ใช้เมธอด files.create กับ uploadType=media

ต่อไปนี้คือวิธีอัปโหลดแบบง่าย

HTTP

  1. สร้างคำขอ POST ไปยัง URI /upload ของเมธอดด้วยพารามิเตอร์การค้นหาของ uploadType=media ดังนี้

    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

ต่อไปนี้คือวิธีดำเนินการอัปโหลดแบบหลายส่วน

Java

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;
    }
  }
}

Python

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()

Node.js

drive/snippets/drive_v3/file_snippets/upload_basic.js
/**
 * Insert new file.
 * @return{obj} file Id
 * */
async function uploadBasic() {
  const fs = require('fs');
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const requestBody = {
    name: 'photo.jpg',
    fields: 'id',
  };
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };
  try {
    const file = await service.files.create({
      requestBody,
      media: media,
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadBasic.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. สร้างคำขอ POST ไปยัง URI /upload ของเมธอดด้วยพารามิเตอร์การค้นหาของ uploadType=multipart ดังนี้

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

  2. สร้างเนื้อหาของคำขอ จัดรูปแบบเนื้อหาตามประเภทเนื้อหาแบบหลายส่วน/เนื้อหาที่เกี่ยวข้อง RFC 2387 ซึ่งมี 2 ส่วน ดังนี้

    • ข้อมูลเมตา ข้อมูลเมตาต้องมาก่อนและต้องมีส่วนหัว Content-Type ที่ตั้งค่าเป็น application/json; charset=UTF-8 เพิ่มข้อมูลเมตาของไฟล์ในรูปแบบ JSON
    • สื่อ สื่อต้องอยู่ลำดับที่ 2 และต้องมีส่วนหัว Content-Type ของ MIME ประเภทใดก็ได้ เพิ่มข้อมูลของไฟล์ลงในส่วนสื่อ

    ระบุแต่ละส่วนด้วยสตริงขอบเขตที่มีขีดกลาง 2 ขีดนำหน้า นอกจากนี้ ให้ใส่ขีดกลาง 2 ตัวต่อจากสตริงขอบเขตสุดท้าย

  3. เพิ่มส่วนหัว HTTP ระดับบนสุดต่อไปนี้

    • Content-Type. ตั้งค่าเป็น multipart/related และใส่สตริงขอบเขตที่คุณใช้เพื่อระบุส่วนต่างๆ ของคําขอ เช่น Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length. ตั้งค่าเป็นจํานวนไบต์ทั้งหมดในเนื้อหาคําขอ
  4. ส่งคำขอ

หากต้องการสร้างหรืออัปเดตเฉพาะส่วนข้อมูลเมตาโดยไม่มีข้อมูลที่เชื่อมโยง ให้ส่งคําขอ POST หรือ PATCH ไปยังปลายทางทรัพยากรมาตรฐาน ดังนี้ https://www.googleapis.com/drive/v3/files หากคําขอสําเร็จ เซิร์ฟเวอร์จะแสดงรหัสสถานะ HTTP 200 OK พร้อมกับข้อมูลเมตาของไฟล์

เมื่อสร้างไฟล์ ผู้ใช้ควรระบุนามสกุลไฟล์ในname ช่องของไฟล์ เช่น เมื่อสร้างไฟล์ JPEG ของรูปภาพ คุณอาจระบุข้อมูลอย่างเช่น "name": "photo.jpg" ในข้อมูลเมตา การเรียกใช้ files.get ในภายหลังจะแสดงพร็อพเพอร์ตี้ fileExtension แบบอ่านอย่างเดียวซึ่งมีส่วนขยายที่ระบุไว้ในฟิลด์ name เดิม

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

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

การอัปโหลดที่กลับมาดำเนินการต่อได้จะมีประโยชน์เมื่อไฟล์มีขนาดใหญ่แตกต่างกันมากหรือเมื่อคำขอมีเวลาจำกัด (เช่น งานเบื้องหลังของระบบปฏิบัติการบนอุปกรณ์เคลื่อนที่และคําขอ App Engine บางรายการ) นอกจากนี้ คุณยังใช้การอัปโหลดที่อัปโหลดต่อได้ในกรณีที่ต้องการแสดงแถบความคืบหน้าการอัปโหลดได้ด้วย

การอัปโหลดที่กลับมาดำเนินการต่อได้ประกอบด้วยขั้นตอนระดับสูงหลายขั้นตอน ดังนี้

  1. ส่งคำขอเริ่มต้นและเรียกข้อมูล URI ของเซสชันที่กลับมาทำงานต่อได้
  2. อัปโหลดข้อมูลและตรวจสอบสถานะการอัปโหลด
  3. (ไม่บังคับ) หากการอัปโหลดถูกรบกวน ให้อัปโหลดต่อ

ส่งคำขอเริ่มต้น

หากต้องการเริ่มการอัปโหลดแบบอัปโหลดต่อได้ ให้ใช้วิธี files.create กับ uploadType=resumable

HTTP

  1. สร้างคำขอ POST ไปยัง URI /upload ของเมธอดด้วยพารามิเตอร์การค้นหาของ uploadType=resumable ดังนี้

    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 ของเซสชันที่กลับมาดำเนินการต่อได้จะหมดอายุหลังจากผ่านไป 1 สัปดาห์

  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 ต้องระบุ เว้นแต่คุณจะใช้การเข้ารหัสการโอนแบบแบ่งกลุ่ม ตั้งค่าเป็นจํานวนไบต์ในส่วนเนื้อหาของคําขอเริ่มต้นนี้
  4. ส่งคำขอ หากคําขอเริ่มต้นเซสชันสําเร็จ การตอบกลับจะมีรหัสสถานะ 200 OK HTTP นอกจากนี้ การตอบกลับยังมีส่วนหัว Location ที่ระบุ URI ของเซสชันที่กลับมาดำเนินการต่อได้ ใช้ URI ของเซสชันที่กลับมาดำเนินการต่อได้เพื่ออัปโหลดข้อมูลไฟล์และค้นหาสถานะการอัปโหลด URI ของเซสชันที่กลับมาดำเนินการต่อได้จะหมดอายุหลังจากผ่านไป 1 สัปดาห์

  5. คัดลอกและบันทึก URL เซสชันที่กลับมาทำงานต่อได้

  6. ดำเนินการต่อเพื่ออัปโหลดเนื้อหา

อัปโหลดเนื้อหา

การอัปโหลดไฟล์ด้วยเซสชันที่อัปโหลดต่อได้ทำได้ 2 วิธีดังนี้

  • อัปโหลดเนื้อหาในคำขอเดียว: ใช้แนวทางนี้เมื่ออัปโหลดไฟล์ได้ในคำขอเดียว หากไม่มีการกำหนดเวลาตายตัวสำหรับคำขอเดียว หรือคุณไม่จำเป็นต้องแสดงตัวบ่งชี้ความคืบหน้าการอัปโหลด วิธีนี้เหมาะที่สุดเนื่องจากต้องใช้คําขอน้อยลงและส่งผลให้มีประสิทธิภาพดีขึ้น
  • อัปโหลดเนื้อหาเป็นหลายกลุ่ม: ใช้แนวทางนี้หากต้องลดปริมาณข้อมูลที่โอนในคําขอเดียว คุณอาจต้องลดข้อมูลที่โอนเมื่อมีการกำหนดเวลาตายตัวสำหรับคำขอแต่ละรายการ เช่น คำขอ App Engine บางคลาส วิธีนี้ยังมีประโยชน์ในกรณีที่คุณต้องระบุตัวบ่งชี้ที่กําหนดเองเพื่อแสดงความคืบหน้าในการอัปโหลด

HTTP - คำขอเดียว

  1. สร้างคำขอ PUT ไปยัง URI ของเซสชันที่กลับมาทำงานต่อได้
  2. เพิ่มข้อมูลของไฟล์ลงในเนื้อหาคำขอ
  3. เพิ่มส่วนหัว HTTP ของ Content-Length โดยตั้งค่าเป็นจำนวนไบต์ในไฟล์
  4. ส่งคำขอ หากคำขออัปโหลดถูกขัดจังหวะหรือคุณได้รับการตอบกลับ5xx ให้ทำตามขั้นตอนในดำเนินการอัปโหลดที่ขัดจังหวะต่อ

HTTP - คำขอหลายรายการ

  1. สร้างคำขอ PUT ไปยัง URI ของเซสชันที่กลับมาทำงานต่อได้

  2. เพิ่มข้อมูลของข้อมูลไปยังเนื้อหาคำขอ สร้างข้อมูลเป็นกลุ่มที่มีขนาดเป็นจํานวนเท่าของ 256 KB (256 x 1024 ไบต์) ยกเว้นกลุ่มสุดท้ายที่จะอัปโหลดจนเสร็จสมบูรณ์ กำหนดขนาดของข้อมูลแต่ละกลุ่มให้ใหญ่ที่สุดเพื่อให้การอัปโหลดมีประสิทธิภาพ

  3. เพิ่มส่วนหัว HTTP ต่อไปนี้

    • Content-Length. ตั้งค่าเป็นจำนวนไบต์ในข้อมูลโค้ดปัจจุบัน
    • Content-Range ตั้งค่าเพื่อแสดงไบต์ในไฟล์ที่คุณอัปโหลด เช่น Content-Range: bytes 0-524287/2000000 แสดงว่าคุณอัปโหลดไบต์แรก 524,288 ไบต์ (256 x 1024 x 2) ในไฟล์ 2,000,000 ไบต์
  4. ส่งคําขอและประมวลผลการตอบกลับ หากคำขออัปโหลดถูกขัดจังหวะหรือคุณได้รับการตอบกลับ 5xx ให้ทำตามขั้นตอนในอัปโหลดต่อจากครั้งที่ขัดจังหวะ

  5. ทำซ้ำขั้นตอนที่ 1 ถึง 4 สำหรับแต่ละส่วนที่ยังคงอยู่ในไฟล์ ใช้ส่วนหัว Range ในคำตอบเพื่อกำหนดจุดเริ่มต้นของข้อมูลส่วนถัดไป อย่าคิดว่าเซิร์ฟเวอร์ได้รับไบต์ทั้งหมดที่ส่งในคำขอก่อนหน้า

เมื่ออัปโหลดไฟล์ทั้งหมดเสร็จแล้ว คุณจะได้รับคำตอบ 200 OK หรือ 201 Created พร้อมกับข้อมูลเมตาที่เชื่อมโยงกับทรัพยากร

อัปโหลดต่อ

หากคำขออัปโหลดสิ้นสุดลงก่อนที่จะได้รับการตอบกลับ หรือหากคุณได้รับการตอบกลับ 503 Service Unavailable คุณต้องอัปโหลดที่หยุดชะงักต่อ

HTTP

  1. หากต้องการขอสถานะการอัปโหลด ให้สร้างคำขอ PUT เปล่าไปยัง URI เซสชันที่กลับมาดำเนินการต่อได้

  2. เพิ่มส่วนหัว Content-Range เพื่อระบุว่าไม่ทราบตำแหน่งปัจจุบันในไฟล์ เช่น ตั้งค่า Content-Range เป็น */2000000 หากความยาวไฟล์ทั้งหมดคือ 2,000,000 ไบต์ หากไม่ทราบขนาดไฟล์ทั้งหมด ให้ตั้งค่า Content-Range เป็น */*

  3. ส่งคำขอ

  4. ประมวลผลการตอบกลับ

    • การตอบกลับ 200 OK หรือ 201 Created บ่งบอกว่าการอัปโหลดเสร็จสมบูรณ์แล้ว และไม่จำเป็นต้องดำเนินการใดๆ เพิ่มเติม
    • การตอบกลับ 308 Resume Incomplete หมายความว่าคุณต้องอัปโหลดไฟล์ต่อ
    • การตอบกลับ 404 Not Found บ่งชี้ว่าเซสชันการอัปโหลดหมดอายุแล้วและต้องเริ่มการอัปโหลดใหม่ตั้งแต่ต้น
  5. หากได้รับการตอบกลับ 308 Resume Incomplete ให้ประมวลผลส่วนหัว Range ของการตอบกลับเพื่อดูว่าเซิร์ฟเวอร์ได้รับไบต์ใด หากคําตอบไม่มีส่วนหัว Range แสดงว่าระบบไม่ได้รับไบต์ใดๆ ตัวอย่างเช่น ส่วนหัว Range ของ bytes=0-42 บ่งบอกว่าระบบได้รับไบต์แรกของไฟล์ 43 ไบต์ และข้อมูลที่จะอัปโหลดต่อไปจะเริ่มที่ไบต์ 44

  6. เมื่อทราบตําแหน่งที่จะอัปโหลดต่อแล้ว ให้อัปโหลดไฟล์ต่อโดยเริ่มจากไบต์ถัดไป ใส่ส่วนหัว Content-Range เพื่อระบุส่วนที่ส่งของไฟล์ เช่น Content-Range: bytes 43-1999999 บ่งบอกว่าคุณส่งไบต์ 44 ถึง 2,000,000

จัดการข้อผิดพลาดในการอัปโหลดสื่อ

เมื่ออัปโหลดสื่อ ให้ทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เพื่อจัดการข้อผิดพลาด

  • สำหรับข้อผิดพลาด 5xx ให้อัปโหลดต่อหรือลองอีกครั้งหากอัปโหลดไม่สำเร็จเนื่องจากการเชื่อมต่อถูกขัดจังหวะ ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อผิดพลาด 5xx ได้ที่ข้อผิดพลาด 500, 502, 503, 504
  • หากเกิดข้อผิดพลาด 403 rate limit ให้ลองอัปโหลดอีกครั้ง ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อผิดพลาด 403 rate limit ได้ที่ข้อผิดพลาด 403: rateLimitExceeded
  • หากพบข้อผิดพลาด 4xx (รวมถึง 403) ขณะอัปโหลดที่ดำเนินการต่อได้ ให้เริ่มอัปโหลดอีกครั้ง ข้อผิดพลาดเหล่านี้บ่งชี้ว่าเซสชันการอัปโหลดหมดอายุแล้วและต้องเริ่มต้นใหม่โดยขอ URI ของเซสชันใหม่ นอกจากนี้ เซสชันการอัปโหลดจะหมดอายุหลังจากไม่มีการใช้งานเป็นเวลา 1 สัปดาห์ด้วย

ประเภทการนําเข้าไปยัง Google เอกสาร

เมื่อสร้างไฟล์ในไดรฟ์ คุณอาจต้องการแปลงไฟล์เป็นประเภทไฟล์ Google Workspace เช่น Google เอกสารหรือชีต เช่น คุณอาจต้องการเปลี่ยนรูปแบบเอกสารจากโปรแกรมประมวลผลคำที่คุณชื่นชอบเป็นเอกสารเพื่อใช้ประโยชน์จากฟีเจอร์ต่างๆ

หากต้องการแปลงไฟล์เป็นประเภทไฟล์ Google Workspace ที่เฉพาะเจาะจง ให้ระบุ Google Workspace mimeType เมื่อสร้างไฟล์

ต่อไปนี้คือวิธีแปลงไฟล์ CSV เป็นชีต Google Workspace

Java

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;
    }
  }
}

Python

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()

Node.js

drive/snippets/drive_v3/file_snippets/upload_with_conversion.js
/**
 * Upload file with conversion
 * @return{obj} file Id
 * */
async function uploadWithConversion() {
  const fs = require('fs');
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const fileMetadata = {
    name: 'My Report',
    mimeType: 'application/vnd.google-apps.spreadsheet',
  };
  const media = {
    mimeType: 'text/csv',
    body: fs.createReadStream('files/report.csv'),
  };

  try {
    const file = await service.files.create({
      requestBody: fileMetadata,
      media: media,
      fields: 'id',
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadWithConversion.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;
        }
    }
}

หากต้องการดูว่า Conversion พร้อมใช้งานหรือไม่ ให้ตรวจสอบอาร์เรย์ importFormats ของทรัพยากร about ก่อนสร้างไฟล์ Conversion ที่รองรับจะแสดงในอาร์เรย์นี้แบบไดนามิก รูปแบบการนําเข้าที่พบได้ทั่วไปมีดังนี้

จากถึง
Microsoft Word, ข้อความ OpenDocument, HTML, RTF, ข้อความธรรมดาGoogle เอกสาร
Microsoft Excel, สเปรดชีต OpenDocument, CSV, TSV, ข้อความธรรมดาGoogle ชีต
Microsoft PowerPoint, OpenDocument PresentationGoogle สไลด์
JPEG, PNG, GIF, BMP, PDFGoogle เอกสาร (ฝังรูปภาพในเอกสาร)
ข้อความธรรมดา (ประเภท MIME พิเศษ), JSONGoogle Apps Script

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

เมื่อคุณแปลงรูปภาพเป็นเอกสาร ไดรฟ์จะใช้การรู้จำอักขระด้วยภาพ (OCR) เพื่อแปลงรูปภาพเป็นข้อความ คุณสามารถปรับปรุงคุณภาพของอัลกอริทึม OCR ได้โดยระบุรหัสภาษา BCP 47 ที่เกี่ยวข้องในพารามิเตอร์ ocrLanguage ข้อความที่ดึงมาจะปรากฏในเอกสารข้างรูปภาพที่ฝัง

ใช้รหัสที่สร้างขึ้นล่วงหน้าเพื่ออัปโหลดไฟล์

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

หากต้องการสร้างรหัสที่สร้างขึ้นล่วงหน้า ให้เรียกใช้ files.generateIds พร้อมจำนวนรหัสที่จะสร้าง

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

กำหนดข้อความที่จัดทําดัชนีได้สําหรับไฟล์ประเภทที่ไม่รู้จัก

ผู้ใช้สามารถใช้ UI ของไดรฟ์เพื่อค้นหาเนื้อหาเอกสารได้ นอกจากนี้ คุณยังใช้files.list และช่อง fullText เพื่อค้นหาเนื้อหาจากแอปได้ด้วย ดูข้อมูลเพิ่มเติมได้ที่ค้นหาไฟล์และโฟลเดอร์

ไดรฟ์จะจัดทําดัชนีเอกสารสําหรับการค้นหาโดยอัตโนมัติเมื่อจดจําประเภทไฟล์ได้ ซึ่งรวมถึงเอกสารข้อความ, PDF, รูปภาพที่มีข้อความ และประเภทอื่นๆ ที่พบบ่อย หากแอปบันทึกไฟล์ประเภทอื่นๆ (เช่น ภาพวาด วิดีโอ และทางลัด) คุณสามารถปรับปรุงการค้นพบได้โดยระบุข้อความที่จัดทําดัชนีได้ในช่อง contentHints.indexableText ของไฟล์

ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อความที่จัดทําดัชนีได้ได้ที่จัดการข้อมูลเมตาของไฟล์