Berichtsdateien herunterladen

Mit der Campaign Manager 360 API können Sie Berichtsdateien herunterladen, die das Ergebnis der Ausführung eines Report Builder-Berichts sind. Außerdem können Sie Nutzern über einen Link direkten Zugriff auf eine Datei gewähren.

Je nach Art des Downloads, den Sie durchführen möchten, verwenden Sie einen der folgenden Ansätze:

  • Direkter Download: Files.get mit dem Parameter alt=media.
  • Dateien in einem Browser herunterladen – browserUrl aus der Ressource „Files“

Im restlichen Teil dieses Leitfadens finden Sie eine detaillierte Anleitung dazu, wie Sie diese Arten von Downloads über die Files-Ressource ausführen.

Vorbereitung

Um eine Datei herunterzuladen, benötigen Sie einige Informationen:

  1. Die ID des Berichts, zu dem die Datei gehört. Sie finden diese Informationen, indem Sie einen neuen Bericht erstellen oder einen vorhandenen Bericht aufrufen.
  2. Die ID der herunterzuladenden Datei. Sie können diese ID abrufen, indem Sie den Bericht aus dem vorherigen Schritt ausführen oder die Liste der vorhandenen Dateien abfragen, wie im folgenden Beispiel:

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        

Das Feld status der Dateiressource muss auf REPORT_AVAILABLE gesetzt sein, damit die Datei heruntergeladen werden kann.

Direkter Download

Für einen direkten Download senden Sie eine autorisierte HTTP-Anfrage GET an den Files-Dienst und fügen den Abfrageparameter alt=media ein. Eine Beispielanfrage könnte so aussehen:

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

Die Antwort, die Sie erhalten, enthält eine Weiterleitung. Ihre Anwendung sollte daher idealerweise so konfiguriert sein, dass sie diese automatisch verarbeitet. Wenn Sie dies lieber manuell vornehmen möchten, finden Sie die Weiterleitungs-URL im Location-Header der Antwort.

Die meisten offiziellen Google-Clientbibliotheken bieten praktische Methoden zum Starten eines direkten Downloads, wie im folgenden Beispiel gezeigt. Wenn Sie einen Download lieber manuell starten möchten, wird im Feld apiUrl der Dateiresource eine vorgefertigte URL bereitgestellt.

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

Fortsetzbare Downloads

Beim Herunterladen großer Berichtsdateien kann es vorkommen, dass der Download mittendrin fehlschlägt. Um die Wiederherstellung und Fortsetzung eines fehlgeschlagenen Downloads zu erleichtern, unterstützt der Dateidienst die Funktion für partielle Downloads.

Beim partiellen Download werden bestimmte Teile einer Datei angefordert. So können Sie große Downloads in kleinere Teile aufteilen. Sie können angeben, welcher Teil einer Datei heruntergeladen werden soll, indem Sie einen Bytebereich in den Range-HTTP-Header Ihrer Anfrage einfügen. Beispiel:

Range: bytes=500-999

Die Funktion zum teilweisen Herunterladen wird von vielen Clientbibliotheken über einen Media Download-Dienst bereitgestellt. Weitere Informationen finden Sie in der Dokumentation zur Clientbibliothek.

Dateien in einem Browser herunterladen

Wenn Sie Nutzern die Möglichkeit geben möchten, eine Datei direkt über ihren Webbrowser herunterzuladen, können Sie die URL verwenden, die im Feld browserUrl der Dateiressource angegeben ist. Sie können einen Nutzer zu dieser URL weiterleiten oder sie als klickbaren Link anbieten. In beiden Fällen muss der Nutzer in einem Google-Konto angemeldet sein, das Zugriff auf Campaign Manager 360-Berichte hat, und die richtigen Berechtigungen für den Zugriff auf die angegebene Datei haben, um den Download zu starten.

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