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

Google ไดรฟ์ 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
<?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. สร้างเนื้อหาของคำขอ จัดรูปแบบเนื้อหาตามประเภทเนื้อหา multipart/related 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 เอกสารเพื่อใช้ประโยชน์จากฟีเจอร์ต่างๆ

หากต้องการแปลงไฟล์เป็นประเภทไฟล์ 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
<?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, งานนำเสนอ OpenDocumentGoogle สไลด์
JPEG, PNG, GIF, BMP, PDFGoogle เอกสาร (ฝังรูปภาพในเอกสาร)
ข้อความธรรมดา (MIME ประเภทพิเศษ), JSONGoogle Apps Script

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

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

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

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

หากต้องการสร้างรหัสที่สร้างไว้ล่วงหน้า ให้เรียกใช้ files.generateIds โดยระบุ จำนวนรหัสที่จะสร้าง

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

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

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

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

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