Tải tệp báo cáo xuống

Campaign Manager 360 API cho phép bạn tải các tệp báo cáo xuống. Đây là kết quả của việc chạy một báo cáo trong Trình tạo báo cáo. Tính năng này cũng hỗ trợ việc cung cấp cho người dùng quyền truy cập trực tiếp vào một tệp thông qua đường liên kết.

Tuỳ thuộc vào loại nội dung tải xuống mà bạn muốn thực hiện, bạn sẽ sử dụng một trong những phương pháp sau:

  • Tải xuống trực tiếp – Files.get có tham số alt=media.
  • Tải tệp xuống trong trình duyệt – browserUrl từ tài nguyên Tệp.

Phần còn lại của hướng dẫn này cung cấp hướng dẫn chi tiết về cách thực hiện các loại tải xuống này thông qua tài nguyên Tệp.

Điều kiện tiên quyết

Để tải tệp xuống, bạn cần cung cấp một số thông tin:

  1. Mã của báo cáo chứa tệp. Bạn có thể tìm thấy thông tin này bằng cách tạo báo cáo mới hoặc tìm kiếm một báo cáo hiện có.
  2. Mã nhận dạng của tệp cần tải xuống. Bạn có thể tìm thấy thông tin này bằng cách chạy báo cáo ở bước trước hoặc truy vấn danh sách các tệp hiện có như trong ví dụ bên dưới:

C#

File target = null;
FileList files;
String nextPageToken = null;

do {
  // Create and execute the files list request.
  ReportsResource.FilesResource.ListRequest request =
      service.Reports.Files.List(profileId, reportId);
  request.PageToken = nextPageToken;
  files = request.Execute();

  foreach (File file in files.Items) {
    if (IsTargetFile(file)) {
      target = file;
      break;
    }
  }

  // Update the next page token.
  nextPageToken = files.NextPageToken;
} while (target == null
    && files.Items.Any()
    && !String.IsNullOrEmpty(nextPageToken));

Java

File target = null;
FileList files;
String nextPageToken = null;

do {
  // Create and execute the files list request.
  files = reporting.reports().files().list(profileId, reportId).setPageToken(nextPageToken)
      .execute();

  for (File file : files.getItems()) {
    if (isTargetFile(file)) {
      target = file;
      break;
    }
  }

  // Update the next page token.
  nextPageToken = files.getNextPageToken();
} while (target == null
    && !files.getItems().isEmpty()
    && !Strings.isNullOrEmpty(nextPageToken));

PHP

$target = null;
$response = null;
$pageToken = null;

do {
    // Create and execute the file list request.
    $response = $this->service->reports_files->listReportsFiles(
        $userProfileId,
        $reportId,
        ['pageToken' => $pageToken]
    );

    foreach ($response->getItems() as $file) {
        if ($this->isTargetFile($file)) {
            $target = $file;
            break;
        }
    }

    $pageToken = $response->getNextPageToken();
} while (empty($target) && !empty($response->getItems()) && !empty($pageToken));

Python

target = None

request = service.reports().files().list(
    profileId=profile_id, reportId=report_id)

while True:
  response = request.execute()

  for report_file in response['items']:
    if is_target_file(report_file):
      target = report_file
      break

  if not target and response['items'] and response['nextPageToken']:
    request = service.reports().files().list_next(request, response)
  else:
    break

Ruby

page_token = nil
target = nil

loop do
  result = service.list_report_files(profile_id, report_id,
    page_token: page_token)

  result.items.each do |file|
    if target_file?(file)
      target = file
      break
    end
  end

  page_token = (result.next_page_token if target.nil? && result.items.any?)
  break if page_token.to_s.empty?
end        

Xin lưu ý rằng bạn phải đặt trường status của tài nguyên tệp thành REPORT_AVAILABLE để đủ điều kiện tải xuống.

Tải xuống trực tiếp

Để thực hiện tải xuống trực tiếp, bạn sẽ thực hiện một yêu cầu HTTP GET được uỷ quyền đến dịch vụ Tệp và thêm tham số truy vấn alt=media. Một yêu cầu ví dụ có thể trông như sau:

GET https://www.googleapis.com/dfareporting/v3.4/reports/12345/files/12345?alt=media HTTP/1.1
Authorization: Bearer your_auth_token

Xin lưu ý rằng phản hồi bạn nhận được sẽ chứa một lệnh chuyển hướng, vì vậy, tốt nhất là bạn nên định cấu hình ứng dụng để tự động xử lý lệnh này. Nếu muốn xử lý việc này theo cách thủ công, bạn có thể tìm thấy URL chuyển hướng trong tiêu đề Location của phản hồi.

Hầu hết thư viện ứng dụng chính thức của Google đều cung cấp các phương thức thuận tiện để bắt đầu tải xuống trực tiếp, như minh hoạ trong ví dụ bên dưới. Nếu muốn bắt đầu tải xuống theo cách thủ công, bạn có thể sử dụng URL được tạo sẵn trong trường apiUrl của tài nguyên tệp.

C#

// Retrieve the file metadata.
File file = service.Files.Get(reportId, fileId).Execute();

if ("REPORT_AVAILABLE".Equals(file.Status)) {
  // Create a get request.
  FilesResource.GetRequest getRequest = service.Files.Get(reportId, fileId);

  // Optional: adjust the chunk size used when downloading the file.
  // getRequest.MediaDownloader.ChunkSize = MediaDownloader.MaximumChunkSize;

  // Execute the get request and download the file.
  using (System.IO.FileStream outFile = new System.IO.FileStream(GenerateFileName(file),
      System.IO.FileMode.Create, System.IO.FileAccess.Write)) {
    getRequest.Download(outFile);
    Console.WriteLine("File {0} downloaded to {1}", file.Id, outFile.Name);
  }
}

Java

// Retrieve the file metadata.
File file = reporting.files().get(reportId, fileId).execute();

if ("REPORT_AVAILABLE".equals(file.getStatus())) {
  // Prepare a local file to download the report contents to.
  java.io.File outFile = new java.io.File(Files.createTempDir(), generateFileName(file));

  // Create a get request.
  Get getRequest = reporting.files().get(reportId, fileId);

  // Optional: adjust the chunk size used when downloading the file.
  // getRequest.getMediaHttpDownloader().setChunkSize(MediaHttpDownloader.MAXIMUM_CHUNK_SIZE);

  // Execute the get request and download the file.
  try (OutputStream stream = new FileOutputStream(outFile)) {
    getRequest.executeMediaAndDownloadTo(stream);
  }

  System.out.printf("File %d downloaded to %s%n", file.getId(), outFile.getAbsolutePath());
}

PHP

// Retrieve the file metadata.
$file = $this->service->files->get($reportId, $fileId);

if ($file->getStatus() === 'REPORT_AVAILABLE') {
    try {
        // Prepare a local file to download the report contents to.
        $fileName = join(
            DIRECTORY_SEPARATOR,
            [sys_get_temp_dir(), $this->generateFileName($file)]
        );
        $fileResource = fopen($fileName, 'w+');
        $fileStream = \GuzzleHttp\Psr7\stream_for($fileResource);

        // Execute the get request and download the file.
        $httpClient = $this->service->getClient()->authorize();
        $result = $httpClient->request(
            'GET',
            $file->getUrls()->getApiUrl(),
            [\GuzzleHttp\RequestOptions::SINK => $fileStream]
        );

        printf('<h3>Report file saved to: %s</h3>', $fileName);
    } finally {
        $fileStream->close();
        fclose($fileResource);
    }
}

Python

# Retrieve the file metadata.
report_file = service.files().get(
    reportId=report_id, fileId=file_id).execute()

if report_file['status'] == 'REPORT_AVAILABLE':
  # Prepare a local file to download the report contents to.
  out_file = io.FileIO(generate_file_name(report_file), mode='wb')

  # Create a get request.
  request = service.files().get_media(reportId=report_id, fileId=file_id)

  # Create a media downloader instance.
  # Optional: adjust the chunk size used when downloading the file.
  downloader = http.MediaIoBaseDownload(
      out_file, request, chunksize=CHUNK_SIZE)

  # Execute the get request and download the file.
  download_finished = False
  while download_finished is False:
    _, download_finished = downloader.next_chunk()

  print('File %s downloaded to %s' % (report_file['id'],
                                      os.path.realpath(out_file.name)))

Ruby

# Retrieve the file metadata.
report_file = service.get_file(report_id, file_id)
return unless report_file.status == 'REPORT_AVAILABLE'

# Prepare a local file to download the report contents to.
File.open(generate_file_name(report_file), 'w') do |out_file|
  # Execute the download request. Providing a download destination
  # retrieves the file contents rather than the file metadata.
  service.get_file(report_id, file_id, download_dest: out_file)

  puts format('File %s downloaded to %s', file_id,
    File.absolute_path(out_file.path))
end

Tải xuống tiếp tục

Khi tải các tệp báo cáo có kích thước lớn xuống, có thể quá trình tải xuống sẽ bị lỗi ở giữa chừng. Để giúp bạn dễ dàng khôi phục và tiếp tục tải xuống khi quá trình tải xuống bị lỗi, dịch vụ tệp hỗ trợ chức năng tải xuống một phần.

Tải xuống một phần là yêu cầu các phần cụ thể của một tệp, cho phép bạn chia các tệp tải xuống lớn thành các phần nhỏ hơn. Bạn có thể chỉ định phần nào của tệp mà bạn muốn tải xuống bằng cách thêm một dải byte vào tiêu đề HTTP Range của yêu cầu. Ví dụ:

Range: bytes=500-999

Nhiều thư viện ứng dụng cung cấp chức năng tải xuống một phần thông qua dịch vụ Tải nội dung nghe nhìn xuống. Hãy tham khảo tài liệu về thư viện ứng dụng để biết thông tin chi tiết.

Tải tệp xuống trong trình duyệt

Nếu muốn cung cấp cho người dùng một cách để tải tệp xuống trực tiếp từ trình duyệt web của họ, bạn có thể sử dụng URL được cung cấp trong trường browserUrl của Tài nguyên tệp. Bạn có thể chuyển hướng người dùng đến URL này hoặc cung cấp URL này dưới dạng một đường liên kết có thể nhấp. Trong cả hai trường hợp, người dùng cần đăng nhập vào một Tài khoản Google có quyền truy cập vào báo cáo Campaign Manager 360 và có các quyền phù hợp để truy cập vào tệp được chỉ định, nhằm bắt đầu tải xuống.

C#

File file = service.Files.Get(reportId, fileId).Execute();
String browserUrl = file.Urls.BrowserUrl;

Java

File file = reporting.files().get(reportId, fileId).execute();
String browserUrl = file.getUrls().getBrowserUrl();

PHP

$file = $this->service->files->get($reportId, $fileId);
$browserUrl = $file->getUrls()->getBrowserUrl();

Python

report_file = service.files().get(
    reportId=report_id, fileId=file_id).execute()
browser_url = report_file['urls']['browserUrl']

Ruby

report_file = service.get_file(report_id, file_id)
browser_url = report_file.urls.browser_url