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

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

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

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

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

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

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

ใช้ 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 ที่เฉพาะเจาะจง ให้ระบุ mimeType Google Workspace เมื่อสร้างไฟล์

ต่อไปนี้คือวิธีแปลงไฟล์ 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 ของไฟล์

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