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

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

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

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

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

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

ไลบรารีของไคลเอ็นต์ 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

ไดรฟ์/snippets/drive-v3/file_snippet/upload_basic.py
from __future__ import print_function

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 โปรดดูการแก้ไขข้อผิดพลาด 5xx
  • หากมีข้อผิดพลาด 403 rate limit รายการ ให้ลองอัปโหลดอีกครั้ง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อผิดพลาด 403 rate limit โปรดดูแก้ไขข้อผิดพลาด 403 error: Rate limit exceeded
  • สำหรับข้อผิดพลาด 4xx ใดๆ (รวมถึง 403) ในระหว่างการอัปโหลดที่ดำเนินการต่อได้ ให้รีสตาร์ทการอัปโหลด ข้อผิดพลาดเหล่านี้ระบุว่าเซสชันการอัปโหลดหมดอายุแล้ว และต้องเริ่มต้นใหม่โดยขอ URI ของเซสชันใหม่ และเซสชันการอัปโหลดจะหมดอายุหลังจากที่ไม่มีการใช้งานเป็นเวลา 1 สัปดาห์

นำเข้าเป็นประเภท Google เอกสาร

เมื่อสร้างไฟล์ในไดรฟ์ คุณอาจต้องแปลงไฟล์เป็นประเภท Google Workspace เช่น Google เอกสารหรือ 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
from __future__ import print_function

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/DriveV3Examples/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 ของทรัพยากรเกี่ยวกับก่อนที่จะสร้างไฟล์ 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 ในข้อมูลเมตาของไฟล์

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

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

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

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

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

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