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

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

    หากคำขอเริ่มต้นสำเร็จ การตอบกลับจะมีรหัสสถานะ HTTP 200 OK รวมอยู่ด้วย นอกจากนี้ยังมีส่วนหัว 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 ความยาวเนื้อหา โดยกำหนดจำนวนไบต์ในไฟล์
  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 ให้ระบุ 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({
      resource: 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 Text, HTML, RTF, ข้อความธรรมดาGoogle เอกสาร
Microsoft Excel, สเปรดชีต OpenDocument, CSV, TSV, ข้อความธรรมดาGoogle ชีต
Microsoft PowerPoint, งานนำเสนอ OpenDocumentGoogle สไลด์
JPEG, PNG, GIF, BMP, PDFGoogle เอกสาร (ฝังรูปภาพในเอกสาร)
ข้อความธรรมดา (ประเภท MIME พิเศษ), JSONGoogle Apps Script

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

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

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

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

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

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

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

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

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

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