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

Google ไดรฟ์ API ช่วยให้คุณอัปโหลดข้อมูลไฟล์ได้เมื่อสร้างหรืออัปเดต File สําหรับข้อมูลเกี่ยวกับวิธีสร้าง 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
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 บ่งบอกว่าได้รับ 44 ไบต์แรกของไฟล์แล้วและส่วนถัดไปที่จะอัปโหลดจะเริ่มต้นด้วยไบต์ 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/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 ของทรัพยากรก่อนสร้างไฟล์ Conversion ที่สนับสนุนพร้อมใช้งานแบบไดนามิก ในอาร์เรย์นี้ รูปแบบการนําเข้าทั่วไปมีดังนี้

จากTo
Microsoft Word, OpenDocument Text, HTML, RTF, ข้อความธรรมดาGoogle เอกสาร
Microsoft Excel, OpenDocument Spreadsheet, CSV, TSV, plain textGoogle ชีต
Microsoft PowerPoint, งานนําเสนอ OpenDocumentGoogle Slides
JPEG, PNG, GIF, BMP และ PDFGoogle เอกสาร (ฝังภาพในเอกสาร)
ข้อความล้วน (ประเภท MIME พิเศษ), JSONGoogle Apps Script

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

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

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

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

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

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

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

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

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

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