Tải dữ liệu tệp lên

API Google Drive cho phép bạn tải dữ liệu tệp lên khi tạo hoặc cập nhật File. Để biết thông tin về cách tạo tệp chỉ có siêu dữ liệu (chẳng hạn như thư mục), hãy xem bài viết Tạo tệp chỉ có siêu dữ liệu.

Bạn có thể thực hiện 3 loại tải lên:

  • Tải lên đơn giản (uploadType=media): Sử dụng loại tải lên này để chuyển một tệp nội dung nghe nhìn nhỏ (tối đa 5 MB) mà không cần cung cấp siêu dữ liệu. Để thực hiện một thao tác tải lên đơn giản, hãy tham khảo phần Thực hiện thao tác tải lên đơn giản.

  • Tải lên nhiều phần (uploadType=multipart): "Sử dụng loại tải lên này để chuyển một tệp nhỏ (tối đa 5 MB) cùng với siêu dữ liệu mô tả tệp đó trong một yêu cầu duy nhất. Để thực hiện thao tác tải lên nhiều phần, hãy tham khảo phần Thực hiện thao tác tải lên nhiều phần.

  • Tải lên có thể tiếp tục (uploadType=resumable): Sử dụng loại tải lên này cho các tệp lớn (lớn hơn 5 MB) và khi có khả năng cao xảy ra gián đoạn mạng, chẳng hạn như khi tạo tệp từ ứng dụng di động. Tải lên có thể tiếp tục cũng là lựa chọn phù hợp cho hầu hết các ứng dụng vì loại tải lên này cũng hoạt động đối với các tệp nhỏ với chi phí tối thiểu là một yêu cầu HTTP bổ sung cho mỗi lần tải lên. Để thực hiện một quy trình tải lên tiếp nối, hãy tham khảo phần Thực hiện quy trình tải lên tiếp nối.

Thư viện ứng dụng Google API triển khai ít nhất một trong các loại tệp tải lên này. Hãy tham khảo tài liệu về thư viện ứng dụng để biết thêm thông tin chi tiết về cách sử dụng từng loại.

Sử dụng PATCH so với PUT

Để nhắc lại, động từ HTTP PATCH hỗ trợ việc cập nhật một phần tài nguyên tệp, trong khi động từ HTTP PUT hỗ trợ việc thay thế toàn bộ tài nguyên. Xin lưu ý rằng PUT có thể gây ra các thay đổi không tương thích khi thêm một trường mới vào một tài nguyên hiện có.

Khi tải một tệp tài nguyên lên, hãy làm theo các nguyên tắc sau:

  • Sử dụng động từ HTTP được ghi lại trong tài liệu tham khảo API cho yêu cầu ban đầu của một quy trình tải lên có thể tiếp tục hoặc cho yêu cầu duy nhất của một quy trình tải lên đơn giản hoặc nhiều phần.
  • Sử dụng PUT cho tất cả các yêu cầu tiếp theo đối với một yêu cầu tải lên có thể tiếp tục sau khi yêu cầu đó bắt đầu. Các yêu cầu này đang tải nội dung lên bất kể phương thức nào đang được gọi.

Thực hiện thao tác tải lên đơn giản

Để thực hiện một thao tác tải lên đơn giản, hãy sử dụng phương thức files.create với uploadType=media.

Sau đây là cách thực hiện một quy trình tải lên đơn giản:

HTTP

  1. Tạo một yêu cầu POST đến URI /upload của phương thức bằng tham số truy vấn uploadType=media:

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

  2. Thêm dữ liệu của tệp vào nội dung yêu cầu.

  3. Thêm các tiêu đề HTTP sau:

    • Content-Type. Đặt thành loại MIME nội dung đa phương tiện của đối tượng đang được tải lên.
    • Content-Length. Đặt thành số byte tương ứng mà bạn tải lên. Nếu sử dụng mã hoá chuyển dữ liệu chia nhỏ, bạn không bắt buộc phải có tiêu đề này.
  4. Gửi yêu cầu. Nếu yêu cầu thành công, máy chủ sẽ trả về mã trạng thái HTTP 200 OK cùng với siêu dữ liệu của tệp. {HTTP}

Khi bạn thực hiện một thao tác tải lên đơn giản, siêu dữ liệu cơ bản sẽ được tạo và một số thuộc tính được suy luận từ tệp, chẳng hạn như loại MIME hoặc modifiedTime. Bạn có thể sử dụng phương thức tải lên đơn giản trong trường hợp có các tệp nhỏ và siêu dữ liệu tệp không quan trọng.

Thực hiện thao tác tải nhiều phần lên

Yêu cầu tải lên nhiều phần cho phép bạn tải siêu dữ liệu và dữ liệu lên trong cùng một yêu cầu. Hãy sử dụng lựa chọn này nếu dữ liệu bạn gửi có dung lượng nhỏ vừa đủ để tải lên lại toàn bộ nếu kết nối bị ngắt.

Để thực hiện thao tác tải lên nhiều phần, hãy sử dụng phương thức files.create với uploadType=multipart.

Sau đây là cách thực hiện quy trình tải lên nhiều phần:

Java

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

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

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

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

Python

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


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

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

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

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

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

  return file.get("id")


if __name__ == "__main__":
  upload_basic()

Node.js

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

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

PHP

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

}

.NET

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

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

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

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

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

HTTP

  1. Tạo một yêu cầu POST đến URI /upload của phương thức bằng tham số truy vấn uploadType=multipart:

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

  2. Tạo nội dung yêu cầu. Định dạng nội dung theo loại nội dung nhiều phần/có liên quan RFC 2387, trong đó có 2 phần:

    • Siêu dữ liệu. Siêu dữ liệu phải đứng trước và phải có tiêu đề Content-Type được đặt thành application/json; charset=UTF-8. Thêm siêu dữ liệu của tệp ở định dạng JSON.
    • Nội dung nghe nhìn. Nội dung nghe nhìn phải đứng thứ hai và phải có tiêu đề Content-Type thuộc bất kỳ loại MIME nào. Thêm dữ liệu của tệp vào phần nội dung nghe nhìn.

    Xác định từng phần bằng một chuỗi ranh giới, đứng trước là hai dấu gạch nối. Ngoài ra, hãy thêm hai dấu gạch ngang sau chuỗi ranh giới cuối cùng.

  3. Thêm các tiêu đề HTTP cấp cao sau:

    • Content-Type. Đặt thành multipart/related và thêm chuỗi ranh giới mà bạn đang dùng để xác định các phần khác nhau của yêu cầu. Ví dụ: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length. Đặt thành tổng số byte trong nội dung của yêu cầu.
  4. Gửi yêu cầu.

Để chỉ tạo hoặc cập nhật phần siêu dữ liệu mà không có dữ liệu liên kết, hãy gửi yêu cầu POST hoặc PATCH đến điểm cuối của tài nguyên chuẩn: https://www.googleapis.com/drive/v3/files Nếu yêu cầu thành công, máy chủ sẽ trả về mã trạng thái HTTP 200 OK cùng với siêu dữ liệu của tệp.

Khi tạo tệp, họ phải chỉ định một phần mở rộng tệp trong trường name của tệp. Ví dụ: khi tạo một tệp JPEG cho ảnh, bạn có thể chỉ định một nội dung nào đó như "name": "photo.jpg" trong siêu dữ liệu. Các lệnh gọi tiếp theo đến files.get sẽ trả về thuộc tính fileExtension chỉ có thể đọc chứa tiện ích được chỉ định ban đầu trong trường name.

Thực hiện quy trình tải lên tiếp nối

Tính năng tải lên tiếp tục cho phép bạn tiếp tục hoạt động tải lên sau khi lỗi giao tiếp làm gián đoạn luồng dữ liệu. Vì bạn không phải bắt đầu lại quá trình tải tệp lớn lên từ đầu, nên tính năng tải lên tiếp tục cũng có thể giảm mức sử dụng băng thông nếu có lỗi mạng.

Tính năng tải lên tiếp tục rất hữu ích khi kích thước tệp của bạn có thể thay đổi đáng kể hoặc khi có giới hạn thời gian cố định cho các yêu cầu (chẳng hạn như các tác vụ nền của hệ điều hành di động và một số yêu cầu nhất định của App Engine). Bạn cũng có thể sử dụng tính năng tải lên tiếp nối trong những trường hợp muốn hiển thị thanh tiến trình tải lên.

Quá trình tải lên tiếp nối bao gồm một số bước cấp cao:

  1. Gửi yêu cầu ban đầu và truy xuất URI của phiên có thể tiếp tục.
  2. Tải dữ liệu lên và theo dõi trạng thái tải lên.
  3. (không bắt buộc) Nếu quá trình tải lên bị gián đoạn, hãy tiếp tục tải lên.

Gửi yêu cầu ban đầu

Để bắt đầu một hoạt động tải lên tiếp tục, hãy sử dụng phương thức files.create với uploadType=resumable.

HTTP

  1. Tạo một yêu cầu POST đến URI /upload của phương thức bằng tham số truy vấn uploadType=resumable:

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

    Nếu yêu cầu khởi tạo thành công, phản hồi sẽ bao gồm mã trạng thái HTTP 200 OK. Ngoài ra, yêu cầu này còn có tiêu đề Location chỉ định URI phiên có thể tiếp tục:

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

    Lưu URI của phiên có thể tiếp tục để bạn có thể tải dữ liệu tệp lên và truy vấn trạng thái tải lên. URI phiên có thể tiếp tục sẽ hết hạn sau một tuần.

  2. Nếu bạn có siêu dữ liệu cho tệp, hãy thêm siêu dữ liệu vào nội dung yêu cầu ở định dạng JSON. Nếu không, hãy để trống nội dung yêu cầu.

  3. Thêm các tiêu đề HTTP sau:

    • X-Upload-Content-Type. Không bắt buộc. Đặt thành loại MIME của dữ liệu tệp được truyền trong các yêu cầu tiếp theo. Nếu loại MIME của dữ liệu không được chỉ định trong siêu dữ liệu hoặc thông qua tiêu đề này, thì đối tượng sẽ được phân phát dưới dạng application/octet-stream.
    • X-Upload-Content-Length. Không bắt buộc. Đặt thành số byte tương ứng của dữ liệu tệp được truyền trong các yêu cầu tiếp theo.
    • Content-Type. Bắt buộc nếu bạn có siêu dữ liệu cho tệp. Đặt thành application/json; charset=UTF-8.
    • Content-Length. Bắt buộc, trừ phi bạn sử dụng phương thức mã hoá chuyển dữ liệu chia nhỏ. Đặt thành số byte trong nội dung của yêu cầu ban đầu này.
  4. Gửi yêu cầu. Nếu yêu cầu khởi tạo phiên thành công, phản hồi sẽ bao gồm mã trạng thái 200 OK HTTP. Ngoài ra, phản hồi này còn có tiêu đề Location chỉ định URI phiên có thể tiếp tục. Sử dụng URI của phiên có thể tiếp tục để tải dữ liệu tệp lên và truy vấn trạng thái tải lên. URI phiên có thể tiếp tục sẽ hết hạn sau một tuần.

  5. Sao chép và lưu URL phiên có thể tiếp tục.

  6. Tiếp tục Tải nội dung lên.

Tải nội dung lên

Có hai cách để tải tệp lên bằng một phiên có thể tiếp tục:

  • Tải nội dung lên trong một yêu cầu: Sử dụng phương pháp này khi tệp có thể được tải lên trong một yêu cầu, nếu không có giới hạn thời gian cố định cho bất kỳ yêu cầu nào hoặc bạn không cần hiển thị chỉ báo tiến trình tải lên. Cách tiếp cận này là hiệu quả nhất vì yêu cầu ít yêu cầu hơn và mang lại hiệu suất tốt hơn.
  • Tải nội dung lên thành nhiều phần: Sử dụng phương pháp này nếu bạn phải giảm lượng dữ liệu được truyền trong bất kỳ yêu cầu riêng lẻ nào. Bạn có thể cần giảm lượng dữ liệu được truyền khi có giới hạn thời gian cố định cho từng yêu cầu riêng lẻ, như có thể xảy ra đối với một số loại yêu cầu nhất định của App Engine. Phương pháp này cũng hữu ích nếu bạn phải cung cấp một chỉ báo tuỳ chỉnh để cho biết tiến trình tải lên.

HTTP – yêu cầu duy nhất

  1. Tạo một yêu cầu PUT đến URI của phiên có thể tiếp tục.
  2. Thêm dữ liệu của tệp vào nội dung yêu cầu.
  3. Thêm tiêu đề HTTP Content-Length, đặt thành số byte trong tệp.
  4. Gửi yêu cầu. Nếu yêu cầu tải lên bị gián đoạn hoặc nếu bạn nhận được phản hồi 5xx, hãy làm theo quy trình trong phần Tiếp tục quá trình tải lên bị gián đoạn.

HTTP – nhiều yêu cầu

  1. Tạo một yêu cầu PUT đến URI của phiên có thể tiếp tục.

  2. Thêm dữ liệu của khối vào nội dung yêu cầu. Tạo các phần có kích thước là bội số của 256 KB (256 x 1024 byte), ngoại trừ phần cuối cùng hoàn tất quá trình tải lên. Giữ kích thước dữ liệu càng lớn càng tốt để đảm bảo hiệu quả tải lên.

  3. Thêm các tiêu đề HTTP sau:

    • Content-Length. Đặt thành số byte trong đoạn hiện tại.
    • Content-Range. Đặt để cho biết số byte trong tệp bạn tải lên. Ví dụ: Content-Range: bytes 0-524287/2000000 cho biết bạn tải 524.288 byte đầu tiên (256 x 1024 x 2) lên trong một tệp có 2.000.000 byte.
  4. Gửi yêu cầu và xử lý phản hồi. Nếu yêu cầu tải lên bị gián đoạn hoặc nếu bạn nhận được phản hồi 5xx, hãy làm theo quy trình trong phần Tiếp tục quá trình tải lên bị gián đoạn.

  5. Lặp lại các bước từ 1 đến 4 cho từng phần còn lại trong tệp. Sử dụng tiêu đề Range trong phản hồi để xác định vị trí bắt đầu phần tiếp theo. Đừng cho rằng máy chủ đã nhận được tất cả các byte được gửi trong yêu cầu trước đó.

Khi toàn bộ quá trình tải tệp lên hoàn tất, bạn sẽ nhận được phản hồi 200 OK hoặc 201 Created, cùng với mọi siêu dữ liệu được liên kết với tài nguyên.

Tiếp tục quá trình tải lên bị gián đoạn

Nếu yêu cầu tải lên bị ngưng trước khi nhận được phản hồi, hoặc nếu bạn nhận được một phản hồi 503 Service Unavailable, thì bạn phải tiếp tục quá trình tải lên bị gián đoạn.

HTTP

  1. Để yêu cầu trạng thái tải lên, hãy tạo một yêu cầu PUT trống cho URI của phiên có thể tiếp tục.

  2. Thêm tiêu đề Content-Range để cho biết vị trí hiện tại trong tệp là không xác định. Ví dụ: hãy đặt Content-Range thành */2000000 nếu tổng chiều dài tệp của bạn là 2.000.000 byte. Nếu bạn không biết kích thước đầy đủ của tệp, hãy đặt Content-Range thành */*.

  3. Gửi yêu cầu.

  4. Xử lý phản hồi:

    • Phản hồi 200 OK hoặc 201 Created cho biết quá trình tải lên đã hoàn tất và bạn không cần làm gì thêm.
    • Phản hồi 308 Resume Incomplete cho biết bạn phải tiếp tục tải tệp lên.
    • Phản hồi 404 Not Found cho biết phiên tải lên đã hết hạn và bạn phải bắt đầu lại quá trình tải lên từ đầu.
  5. Nếu bạn nhận được phản hồi 308 Resume Incomplete, hãy xử lý tiêu đề Range của phản hồi để xác định số byte mà máy chủ đã nhận được. Nếu phản hồi không có tiêu đề Range, thì không có byte nào được nhận. Ví dụ: tiêu đề Range của bytes=0-42 cho biết 43 byte đầu tiên của tệp đã được nhận và khối tiếp theo cần tải lên sẽ bắt đầu từ byte 44.

  6. Giờ thì bạn đã biết vị trí để tiếp tục tải lên, hãy tiếp tục tải tệp lên bắt đầu từ byte tiếp theo. Thêm tiêu đề Content-Range để cho biết phần nào của tệp mà bạn gửi. Ví dụ: Content-Range: bytes 43-1999999 cho biết bạn gửi các byte từ 44 đến 2.000.000.

Xử lý lỗi tải nội dung nghe nhìn lên

Khi tải nội dung nghe nhìn lên, hãy làm theo các phương pháp hay nhất sau đây để xử lý lỗi:

  • Đối với lỗi 5xx, hãy tiếp tục hoặc thử tải lại các lần tải không thành công do gián đoạn kết nối. Để biết thêm thông tin về cách xử lý lỗi 5xx, hãy tham khảo bài viết Lỗi 500, 502, 503, 504.
  • Đối với lỗi 403 rate limit, hãy thử tải lên lại. Để biết thêm thông tin về cách xử lý lỗi 403 rate limit, hãy tham khảo lỗi 403: rateLimitExceeded.
  • Đối với mọi lỗi 4xx (bao gồm cả 403) trong quá trình tải lên có thể tiếp tục, hãy khởi động lại quá trình tải lên. Những lỗi này cho biết phiên tải lên đã hết hạn và bạn phải khởi động lại bằng cách yêu cầu một URI phiên mới. Phiên tải lên cũng hết hạn sau một tuần không hoạt động.

Các loại tệp có thể nhập vào Google Tài liệu

Khi tạo một tệp trong Drive, bạn có thể muốn chuyển đổi tệp đó thành một loại tệp Google Workspace, chẳng hạn như Google Tài liệu hoặc Trang tính. Ví dụ: có thể bạn muốn chuyển đổi một tài liệu từ trình xử lý văn bản mà bạn yêu thích sang Tài liệu để tận dụng các tính năng của Tài liệu.

Để chuyển đổi một tệp sang một loại tệp cụ thể của Google Workspace, hãy chỉ định mimeType Google Workspace khi tạo tệp.

Sau đây là cách chuyển đổi tệp CSV sang trang tính trên Google Workspace:

Java

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

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

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

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

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

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

Python

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


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

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

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

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

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

  return file.get("id")


if __name__ == "__main__":
  upload_with_conversion()

Node.js

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

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

PHP

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

}

.NET

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

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

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

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

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

Để biết một lượt chuyển đổi có sẵn hay không, hãy kiểm tra mảng importFormats của tài nguyên about trước khi tạo tệp. Các lượt chuyển đổi được hỗ trợ có sẵn một cách linh động trong mảng này. Một số định dạng nhập phổ biến là:

TừĐến
Microsoft Word, OpenDocument Text, HTML, RTF, văn bản thuần tuýGoogle Tài liệu
Microsoft Excel, Bảng tính OpenDocument, CSV, TSV, văn bản thuần tuýGoogle Trang tính
Microsoft PowerPoint, Bản trình bày OpenDocumentGoogle Trang trình bày
JPEG, PNG, GIF, BMP, PDFGoogle Tài liệu (nhúng hình ảnh vào Tài liệu)
Văn bản thuần tuý (loại MIME đặc biệt), JSONGoogle Apps Script

Khi bạn tải lên và chuyển đổi nội dung nghe nhìn trong yêu cầu update thành tệp Tài liệu, Trang tính hoặc Trang trình bày, toàn bộ nội dung của tài liệu sẽ được thay thế.

Khi bạn chuyển đổi một hình ảnh sang Tài liệu, Drive sẽ sử dụng công nghệ Nhận dạng ký tự quang học (OCR) để chuyển đổi hình ảnh đó thành văn bản. Bạn có thể cải thiện chất lượng của thuật toán OCR bằng cách chỉ định mã ngôn ngữ BCP 47 áp dụng trong tham số ocrLanguage. Văn bản được trích xuất sẽ xuất hiện trong Tài liệu cùng với hình ảnh được nhúng.

Sử dụng mã nhận dạng được tạo sẵn để tải tệp lên

API Drive cho phép bạn truy xuất danh sách mã nhận dạng tệp được tạo trước dùng để tải lên và tạo tài nguyên. Yêu cầu tải lên và tạo tệp có thể sử dụng các mã nhận dạng được tạo sẵn này. Đặt trường id trong siêu dữ liệu của tệp.

Để tạo mã nhận dạng được tạo trước, hãy gọi files.generateIds với số lượng mã nhận dạng cần tạo.

Bạn có thể thử lại việc tải lên một cách an toàn bằng mã nhận dạng được tạo trước nếu có lỗi máy chủ không xác định hoặc hết thời gian chờ. Nếu tệp được tạo thành công, các lần thử lại tiếp theo sẽ trả về lỗi HTTP 409 và không tạo các tệp trùng lặp.

Xác định văn bản có thể lập chỉ mục cho các loại tệp không xác định

Người dùng có thể sử dụng giao diện người dùng Drive để tìm nội dung tài liệu. Bạn cũng có thể dùng files.list và trường fullText để tìm nội dung trong ứng dụng của mình. Để biết thêm thông tin, hãy xem phần Tìm tệp và thư mục.

Drive tự động lập chỉ mục tài liệu để tìm kiếm khi nhận dạng loại tệp, bao gồm cả tài liệu văn bản, tệp PDF, hình ảnh có văn bản và các loại tệp phổ biến khác. Nếu ứng dụng của bạn lưu các loại tệp khác (chẳng hạn như bản vẽ, video và lối tắt), bạn có thể cải thiện khả năng được phát hiện bằng cách cung cấp văn bản có thể lập chỉ mục trong trường contentHints.indexableText của tệp.

Để biết thêm thông tin về văn bản có thể lập chỉ mục, hãy xem bài viết Quản lý siêu dữ liệu của tệp.