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

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

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

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

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

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

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

ใช้ PATCH เทียบกับ PUT

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

เมื่ออัปโหลดแหล่งข้อมูลไฟล์ ให้ใช้หลักเกณฑ์ต่อไปนี้

  • ใช้คำกริยา HTTP ที่บันทึกไว้ในการอ้างอิง API สำหรับคำขอเริ่มต้นของ การอัปโหลดที่กลับมาทำงานต่อได้ หรือคำขอเดียวสำหรับการอัปโหลดแบบง่ายหรือการอัปโหลดหลายส่วน
  • ใช้ PUT สำหรับคำขอที่ตามมาทั้งหมดสำหรับการอัปโหลดที่ดำเนินการต่อได้เมื่อ ได้เริ่มคำขอแล้ว คำขอเหล่านี้อัปโหลดเนื้อหาไม่ว่าในกรณีใด เมธอดที่เรียกใช้

ทำการอัปโหลดอย่างง่าย

หากต้องการทำการอัปโหลดอย่างง่าย ให้ใช้ เมธอด files.create ด้วย uploadType=media

รายการต่อไปนี้แสดงวิธีการอัปโหลดอย่างง่าย:

HTTP

  1. สร้างคำขอ POST ไปยัง URI /upload ของเมธอดที่มีคำค้นหา พารามิเตอร์ของ uploadType=media:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=media

  2. เพิ่มข้อมูลของไฟล์ในเนื้อหาคำขอ

  3. เพิ่มส่วนหัว HTTP ต่อไปนี้

    • Content-Type ตั้งค่าเป็นประเภทสื่อ MIME ของออบเจ็กต์ที่กำลังอยู่ ที่อัปโหลด
    • Content-Length กำหนดจำนวนไบต์ที่คุณอัปโหลด หากคุณใช้ การเข้ารหัสการโอนเป็นกลุ่ม ไม่จำเป็นต้องใช้ส่วนหัวนี้
  4. ส่งคำขอ หากคำขอประสบความสำเร็จ เซิร์ฟเวอร์จะส่งคืนรหัสสถานะ HTTP 200 OK พร้อมกับข้อมูลเมตาของไฟล์ {HTTP}

เมื่อคุณทำการอัปโหลดแบบง่ายๆ จะมีการสร้างข้อมูลเมตาพื้นฐานและแอตทริบิวต์บางรายการ จะอนุมานจากไฟล์ เช่น ประเภท MIME หรือ modifiedTime คุณสามารถใช้ การอัปโหลดอย่างง่าย ในกรณีที่คุณมีไฟล์ขนาดเล็ก และข้อมูลเมตาของไฟล์ เป็นอย่างมาก

ดำเนินการอัปโหลดหลายส่วน

คำขออัปโหลดที่มีหลายส่วนช่วยให้คุณสามารถอัปโหลดข้อมูลเมตาและข้อมูล อีกครั้ง ใช้ตัวเลือกนี้ถ้าข้อมูลที่คุณส่งมีขนาดเล็กพอที่จะอัปโหลดอีกครั้ง ทั้งหมด หากการเชื่อมต่อล้มเหลว

หากต้องการอัปโหลดหลายส่วน ให้ใช้ เมธอด files.create ด้วย uploadType=multipart

ข้อมูลต่อไปนี้แสดงวิธีการอัปโหลดหลายส่วน

Java

drive/snippets/drive_v3/src/main/java/UploadBasic.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate use of Drive insert file API */
public class UploadBasic {

  /**
   * Upload new file.
   *
   * @return Inserted file metadata if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadBasic() throws IOException {
    // Load pre-authorized user credentials from the environment.
    // TODO(developer) - See https://developers.google.com/identity for
    // guides on implementing OAuth2 for your application.
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();
    // Upload file photo.jpg on drive.
    File fileMetadata = new File();
    fileMetadata.setName("photo.jpg");
    // File's content.
    java.io.File filePath = new java.io.File("files/photo.jpg");
    // Specify media type and file-path for file.
    FileContent mediaContent = new FileContent("image/jpeg", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to upload file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/upload_basic.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_basic():
  """Insert new file.
  Returns : Id's of the file uploaded

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    file_metadata = {"name": "download.jpeg"}
    media = MediaFileUpload("download.jpeg", mimetype="image/jpeg")
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File ID: {file.get("id")}')

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.get("id")


if __name__ == "__main__":
  upload_basic()

Node.js

drive/snippets/drive_v3/file_snippets/upload_basic.js
/**
 * Insert new file.
 * @return{obj} file Id
 * */
async function uploadBasic() {
  const fs = require('fs');
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const requestBody = {
    name: 'photo.jpg',
    fields: 'id',
  };
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };
  try {
    const file = await service.files.create({
      requestBody,
      media: media,
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadBasic.php
use Google\Client;
use Google\Service\Drive;
# TODO - PHP client currently chokes on fetching start page token
function uploadBasic()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
        'name' => 'photo.jpg'));
        $content = file_get_contents('../files/photo.jpg');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'image/jpeg',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    } 

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/UploadBasic.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive insert file API
    public class UploadBasic
    {
        /// <summary>
        /// Upload new file.
        /// </summary>
        /// <param name="filePath">Image path to upload.</param>
        /// <returns>Inserted file metadata if successful, null otherwise.</returns>
        public static string DriveUploadBasic(string filePath)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                // Upload file photo.jpg on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "photo.jpg"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new file on drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "image/jpeg");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

HTTP

  1. สร้างคำขอ POST ไปยัง URI /upload ของเมธอดที่มีคำค้นหา พารามิเตอร์ของ uploadType=multipart:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart

  2. สร้างเนื้อหาของคำขอ จัดรูปแบบเนื้อหาตาม ประเภทเนื้อหาแบบหลายส่วน/ที่เกี่ยวข้อง RFC 2387 ซึ่งมี 2 ส่วน ได้แก่

    • ข้อมูลเมตา ข้อมูลเมตาต้องมาก่อนและต้องมี Content-Type ตั้งค่าส่วนหัวเป็น application/json; charset=UTF-8 เพิ่มข้อมูลเมตาของไฟล์ ในรูปแบบ JSON
    • สื่อ สื่อต้องมาก่อนลำดับที่ 2 และต้องมีส่วนหัว Content-Type ประเภท MIME เพิ่มข้อมูลของไฟล์ในส่วนสื่อ

    ระบุแต่ละส่วนด้วยสตริงขอบเขต ซึ่งนำหน้าด้วยขีดกลาง 2 ตัว ใน นอกจากนี้ ให้เพิ่มขีดกลาง 2 ตัวหลังสตริงขอบเขตสุดท้าย

  3. เพิ่มส่วนหัว HTTP ระดับบนสุดต่อไปนี้

    • Content-Type ตั้งค่าเป็น multipart/related และรวมขอบเขต สตริงที่คุณใช้ระบุส่วนต่างๆ ของคำขอ สำหรับ ตัวอย่าง: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length ตั้งค่าเป็นจำนวนไบต์ทั้งหมดในเนื้อความของคำขอ
  4. ส่งคำขอ

หากต้องการสร้างหรืออัปเดตเฉพาะส่วนข้อมูลเมตา โดยไม่มีข้อมูลที่เชื่อมโยง ส่งคำขอ POST หรือ PATCH ไปยังปลายทางทรัพยากรมาตรฐาน https://www.googleapis.com/drive/v3/files หากคำขอประสบความสำเร็จ เซิร์ฟเวอร์จะส่งคืนรหัสสถานะ HTTP 200 OK พร้อมกับ ข้อมูลเมตา

เมื่อสร้างไฟล์ ผู้ใช้ควรระบุนามสกุลไฟล์ใน name ของไฟล์ ด้วย เช่น เมื่อสร้างไฟล์ JPEG รูปภาพ คุณอาจระบุบางอย่าง เช่น "name": "photo.jpg" ในข้อมูลเมตา การเรียก files.get ที่ตามมาจะแสดงพร็อพเพอร์ตี้ fileExtension แบบอ่านอย่างเดียว ที่มีส่วนขยายซึ่งระบุไว้ก่อนหน้านี้ในช่อง name

ดำเนินการอัปโหลดที่ดำเนินการต่อได้

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

การอัปโหลดที่ดำเนินการต่อได้มีประโยชน์เมื่อขนาดไฟล์ของคุณอาจแตกต่างกันอย่างมาก หรือในกรณีที่ มีการจำกัดเวลาที่แน่นอนสำหรับคำขอ (เช่น งานที่ทำงานอยู่เบื้องหลังของระบบปฏิบัติการบนอุปกรณ์เคลื่อนที่ คำขอ App Engine บางรายการ) นอกจากนี้ คุณอาจใช้การอัปโหลดที่ดำเนินการต่อได้สำหรับ ที่คุณต้องการแสดงแถบความคืบหน้าในการอัปโหลด

การอัปโหลดที่ดำเนินการต่อได้ประกอบด้วยขั้นตอนระดับสูงหลายขั้นตอนดังนี้

  1. ส่งคำขอเริ่มต้นและเรียก URI ของเซสชันที่ดำเนินการต่อได้
  2. อัปโหลดข้อมูลและตรวจสอบสถานะการอัปโหลด
  3. (ไม่บังคับ) หากการอัปโหลดถูกรบกวน ให้อัปโหลดต่อ

ส่งคำขอเริ่มต้น

หากต้องการเริ่มการอัปโหลดที่ดำเนินการต่อได้ ให้ใช้ เมธอด files.create ด้วย uploadType=resumable

HTTP

  1. สร้างคำขอ POST ไปยัง URI /upload ของเมธอดที่มีคำค้นหา พารามิเตอร์ของ uploadType=resumable:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable

    หากคำขอเริ่มต้นสำเร็จ การตอบกลับจะมี 200 OK รหัสสถานะ HTTP นอกจากนี้ยังมีส่วนหัว Location ที่ ระบุ URI ของเซสชันที่เรียกได้ว่าดำเนินการต่อได้

    HTTP/1.1 200 OK
    Location: https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=xa298sd_sdlkj2
    Content-Length: 0
    

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

  2. หากคุณมีข้อมูลเมตาสำหรับไฟล์ ให้เพิ่มข้อมูลเมตาลงในเนื้อหาคำขอ ในรูปแบบ JSON หรือปล่อยเนื้อหาคำขอว่างไว้

  3. เพิ่มส่วนหัว HTTP ต่อไปนี้

    • X-Upload-Content-Type (ไม่บังคับ) ตั้งค่าเป็นประเภท MIME ของไฟล์ ซึ่งจะโอนไปในคำขอที่ตามมา หากประเภท MIME ของข้อมูลที่ไม่ได้ระบุไว้ในข้อมูลเมตาหรือผ่านส่วนหัวนี้ ออบเจ็กต์ทำหน้าที่เป็น application/octet-stream.
    • X-Upload-Content-Length (ไม่บังคับ) กำหนดเป็นจำนวนไบต์ของ ซึ่งมีการโอนในคำขอต่อๆ มา
    • Content-Type ต้องระบุหากคุณมีข้อมูลเมตาสำหรับไฟล์ กำหนดเป็น application/json; charset=UTF-8
    • Content-Length ต้องระบุ ยกเว้นในกรณีที่คุณใช้การเข้ารหัสการโอนเป็นกลุ่ม กำหนดเป็นจำนวนไบต์ในเนื้อหาของคำขอเริ่มต้นนี้
  4. ส่งคำขอ หากคำขอเริ่มเซสชันสำเร็จ การตอบกลับจะมีรหัสสถานะ 200 OK HTTP นอกจากนี้ การตอบกลับ มีส่วนหัว Location ที่ระบุ URI ของเซสชันที่เรียกได้ว่าดำเนินการต่อได้ ใช้ URI เซสชันที่ดำเนินการต่อได้เพื่ออัปโหลดข้อมูลไฟล์และค้นหา สถานะการอัปโหลด URI เซสชันที่ดำเนินการต่อได้จะหมดอายุหลังจากผ่านไป 1 สัปดาห์

  5. คัดลอกและบันทึก URL ของเซสชันที่ดำเนินการต่อได้

  6. ไปที่อัปโหลดเนื้อหาต่อ

อัปโหลดเนื้อหา

การอัปโหลดไฟล์ที่มีเซสชันที่กลับมาทำงานต่อได้มี 2 วิธีดังนี้

  • อัปโหลดเนื้อหาในคำขอเดียว: ใช้วิธีการนี้เมื่อไฟล์สามารถ จะอัปโหลดในคำขอเดียว หากไม่มีการจำกัดเวลาที่แน่นอนสำหรับ หรือไม่ต้องแสดงตัวระบุความคืบหน้าในการอัปโหลด ช่วงเวลานี้ วิธีที่ดีที่สุด เนื่องจากต้องการคำขอน้อยลงและให้ผลลัพธ์ที่ดีขึ้น ด้านประสิทธิภาพ
  • อัปโหลดเนื้อหาเป็นกลุ่ม: ใช้วิธีนี้หากจำเป็น ลดจำนวนข้อมูลที่โอนในคำขอหนึ่งๆ คุณอาจต้อง เพื่อลดการโอนข้อมูลเมื่อมีการจำกัดเวลาที่แน่นอนสำหรับผู้ใช้แต่ละราย เช่น ในกรณีของคำขอ App Engine บางคลาส แนวทางนี้ยังมีประโยชน์ในกรณีที่คุณต้องระบุตัวบ่งชี้ที่กำหนดเองเพื่อ แสดงความคืบหน้าในการอัปโหลด

HTTP - คำขอเดียว

  1. สร้างคำขอ PUT ไปยัง URI เซสชันที่ดำเนินการต่อได้
  2. เพิ่มข้อมูลของไฟล์ในเนื้อหาคำขอ
  3. เพิ่มส่วนหัว HTTP ความยาวของเนื้อหา โดยกำหนดจำนวนไบต์ในไฟล์
  4. ส่งคำขอ หากคำขออัปโหลดถูกขัดจังหวะ หรือหากคุณได้รับ 5xx โปรดทำตามขั้นตอนในการอัปโหลดที่หยุดชะงักต่อ

HTTP - คำขอหลายรายการ

  1. สร้างคำขอ PUT ไปยัง URI เซสชันที่ดำเนินการต่อได้

  2. เพิ่มข้อมูลของกลุ่มลงในเนื้อหาคำขอ สร้างกลุ่มโดยแบ่งเป็นพหุคูณ ขนาด 256 KB (256 x 1024 ไบต์) ยกเว้นส่วนสุดท้ายที่สมบูรณ์ ถึงการอัปโหลด ทำให้กลุ่มมีขนาดใหญ่ที่สุดเท่าที่จะทำได้เพื่อให้การอัปโหลด มีประสิทธิภาพ

  3. เพิ่มส่วนหัว HTTP ต่อไปนี้

    • Content-Length กําหนดจํานวนไบต์ในกลุ่มปัจจุบัน
    • Content-Range ตั้งค่าเพื่อแสดงไบต์ในไฟล์ที่คุณอัปโหลด สำหรับ ตัวอย่างเช่น Content-Range: bytes 0-524287/2000000 จะแสดงว่าคุณอัปโหลด 524,288 ไบต์แรก (256 x 1024 x 2) ในไฟล์ขนาด 2,000,000 ไบต์
  4. ส่งคำขอและประมวลผลการตอบกลับ หากคำขออัปโหลดคือ หยุดชะงัก หรือหากคุณได้รับการตอบกลับ5xx ให้ทำตามขั้นตอนใน อัปโหลดที่หยุดชะงักต่อ

  5. ทำซ้ำขั้นตอนที่ 1 ถึง 4 สำหรับแต่ละกลุ่มที่เหลืออยู่ในไฟล์ ใช้เมนู Range ในการตอบกลับเพื่อกำหนดตำแหน่งที่จะเริ่มกลุ่มถัดไป อย่าคิดว่าเซิร์ฟเวอร์ได้รับไบต์ทั้งหมดที่ส่งในคำขอก่อนหน้า

เมื่ออัปโหลดไฟล์ทั้งไฟล์เสร็จแล้ว คุณจะได้รับ 200 OK หรือ 201 Created พร้อมกับข้อมูลเมตาที่เชื่อมโยงกับทรัพยากร

ดำเนินการอัปโหลดที่หยุดชะงักต่อ

หากคำขออัปโหลดถูกยุติก่อนการตอบกลับ หรือหากได้รับการตอบกลับ503 Service Unavailable คุณต้องกลับมาอัปโหลดที่หยุดชะงักอีกครั้ง

HTTP

  1. หากต้องการขอสถานะการอัปโหลด ให้สร้างคำขอ PUT ที่ว่างเปล่าไปยัง URI เซสชันที่เรียกกลับมาทำงานอีกครั้ง

  2. เพิ่มส่วนหัว Content-Range เพื่อระบุว่าตำแหน่งปัจจุบันใน ไม่รู้จักไฟล์ ตัวอย่างเช่น ตั้งค่า Content-Range เป็น */2000000 หาก ความยาวรวมของไฟล์คือ 2,000,000 ไบต์ หากคุณไม่ทราบขนาดเต็มของ ให้ตั้งค่า Content-Range เป็น */*

  3. ส่งคำขอ

  4. ประมวลผลคำตอบ

    • การตอบกลับ 200 OK หรือ 201 Created บ่งบอกว่าการอัปโหลดเป็น เสร็จสมบูรณ์ และไม่จำเป็นต้องดำเนินการใดๆ เพิ่มเติม
    • การตอบกลับ 308 Resume Incomplete ระบุว่าคุณต้องดำเนินการต่อ เพื่ออัปโหลดไฟล์
    • การตอบกลับ 404 Not Found ระบุว่าเซสชันการอัปโหลดหมดอายุแล้ว และ จะต้องเริ่มอัปโหลดใหม่ตั้งแต่ต้น
  5. หากคุณได้รับการตอบกลับ 308 Resume Incomplete ให้ประมวลผล Range ของการตอบกลับเพื่อระบุไบต์ที่เซิร์ฟเวอร์ได้รับ หาก การตอบกลับไม่มีส่วนหัว Range จึงไม่ได้รับไบต์ ตัวอย่างเช่น ส่วนหัว Range ของ bytes=0-42 จะระบุว่า ได้รับไฟล์ขนาด 43 ไบต์และชิ้นส่วนถัดไปที่จะอัปโหลด จะขึ้นต้นด้วยไบต์ 44

  6. เมื่อคุณทราบแล้วว่าจะอัปโหลดต่อได้จากที่ใด ให้อัปโหลดไฟล์ต่อ เริ่มต้นด้วยไบต์ถัดไป มี Content-Range เพื่อระบุว่าส่วนใดของไฟล์ที่คุณส่ง สำหรับ ตัวอย่างเช่น Content-Range: bytes 43-1999999 บ่งบอกว่าคุณ ส่งไบต์ 44 ถึง 2,000,000

จัดการข้อผิดพลาดในการอัปโหลดสื่อ

เมื่อคุณอัปโหลดสื่อ โปรดทำตามแนวทางปฏิบัติแนะนำเหล่านี้เพื่อจัดการข้อผิดพลาด

  • หากเกิดข้อผิดพลาด 5xx รายการ ให้อัปโหลดต่อหรือลองอัปโหลดอีกครั้งที่ไม่สำเร็จเนื่องจากการเชื่อมต่อ การรบกวน ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อผิดพลาด 5xx ได้ที่ ข้อผิดพลาด 500, 502, 503, 504
  • หากพบข้อผิดพลาด 403 rate limit รายการ ให้ลองอัปโหลดอีกครั้ง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ การจัดการข้อผิดพลาด 403 rate limit โปรดดูข้อผิดพลาด 403: rateLimitExceeded
  • สำหรับข้อผิดพลาด 4xx (รวมถึง 403) ระหว่างการอัปโหลดที่ดำเนินการต่อได้ ให้รีสตาร์ท การอัปโหลด ข้อผิดพลาดเหล่านี้ระบุว่าเซสชันการอัปโหลดหมดอายุแล้วและ รีสตาร์ทโดยขอ URI เซสชันใหม่ อัปโหลดเซสชัน จะหมดอายุหลังจากไม่มีการใช้งานนาน 1 สัปดาห์

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

เมื่อสร้างไฟล์ในไดรฟ์ คุณอาจต้องการแปลงไฟล์ ลงในประเภทไฟล์ Google Workspace เช่น Google เอกสารหรือ ชีต ตัวอย่างเช่น คุณอาจต้องการเปลี่ยนรูปแบบเอกสารจาก โปรแกรมประมวลผลคำที่คุณชื่นชอบลงในเอกสารเพื่อใช้ประโยชน์จาก ใหม่ๆ

หากต้องการแปลงไฟล์เป็นประเภทเฉพาะของ Google Workspace ให้ระบุ mimeType ของ Google Workspace เมื่อสร้างไฟล์

ข้อมูลต่อไปนี้แสดงวิธีแปลงไฟล์ CSV เป็นชีต Google Workspace

Java

drive/snippets/drive_v3/src/main/java/UploadWithConversion.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate Drive's upload with conversion use-case. */
public class UploadWithConversion {

  /**
   * Upload file with conversion.
   *
   * @return Inserted file id if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadWithConversion() throws IOException {
    // Load pre-authorized user credentials from the environment.
    // TODO(developer) - See https://developers.google.com/identity for
    // guides on implementing OAuth2 for your application.
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    // File's metadata.
    File fileMetadata = new File();
    fileMetadata.setName("My Report");
    fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet");

    java.io.File filePath = new java.io.File("files/report.csv");
    FileContent mediaContent = new FileContent("text/csv", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to move file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/upload_with_conversion.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_with_conversion():
  """Upload file with conversion
  Returns: ID of the file uploaded

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)

    file_metadata = {
        "name": "My Report",
        "mimeType": "application/vnd.google-apps.spreadsheet",
    }
    media = MediaFileUpload("report.csv", mimetype="text/csv", resumable=True)
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File with ID: "{file.get("id")}" has been uploaded.')

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.get("id")


if __name__ == "__main__":
  upload_with_conversion()

Node.js

drive/snippets/drive_v3/file_snippets/upload_with_conversion.js
/**
 * Upload file with conversion
 * @return{obj} file Id
 * */
async function uploadWithConversion() {
  const fs = require('fs');
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const fileMetadata = {
    name: 'My Report',
    mimeType: 'application/vnd.google-apps.spreadsheet',
  };
  const media = {
    mimeType: 'text/csv',
    body: fs.createReadStream('files/report.csv'),
  };

  try {
    const file = await service.files.create({
      requestBody: fileMetadata,
      media: media,
      fields: 'id',
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadWithConversion.php
use Google\Client;
use Google\Service\Drive;
function uploadWithConversion()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
            'name' => 'My Report',
            'mimeType' => 'application/vnd.google-apps.spreadsheet'));
        $content = file_get_contents('../files/report.csv');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'text/csv',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/UploadWithConversion.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate Drive's upload with conversion use-case.
    public class UploadWithConversion
    {
        /// <summary>
        /// Upload file with conversion.
        /// </summary>
        /// <param name="filePath">Id of the spreadsheet file.</param>
        /// <returns>Inserted file id if successful, null otherwise.</returns>
        public static string DriveUploadWithConversion(string filePath)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                // Upload file My Report on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "My Report",
                    MimeType = "application/vnd.google-apps.spreadsheet"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "text/csv");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

หากต้องการดูว่ามี Conversion พร้อมใช้งานหรือไม่ ให้ตรวจสอบอาร์เรย์ importFormats ของทรัพยากร about ก่อนสร้างไฟล์ Conversion ที่รองรับจะแสดงแบบไดนามิกในอาร์เรย์นี้ พบบ่อย รูปแบบการนำเข้าได้แก่

จากถึง
Microsoft Word, OpenDocument Text, HTML, RTF, ข้อความธรรมดาGoogle เอกสาร
Microsoft Excel, สเปรดชีต OpenDocument, CSV, TSV, ข้อความธรรมดาGoogle ชีต
Microsoft PowerPoint, OpenDocument งานนำเสนอGoogle สไลด์
JPEG, PNG, GIF, BMP, PDFGoogle เอกสาร (ฝังรูปภาพไว้ในเอกสาร)
ข้อความธรรมดา (ประเภท MIME พิเศษ), JSONGoogle Apps Script

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

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

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

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

หากต้องการสร้างรหัสที่สร้างไว้ล่วงหน้า โปรดโทร files.generateIds ที่มีตัวเลือก จำนวนรหัสที่จะสร้าง

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

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

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

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

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