Télécharger les fichiers du rapport

L'API Campaign Manager 360 vous permet de télécharger des fichiers de rapport suite à la génération d'un rapport. Il permet également aux utilisateurs d'accéder directement à un fichier via un lien.

Selon le type de téléchargement que vous souhaitez effectuer, suivez l'une des méthodes suivantes:

  • Téléchargement direct : Files.get avec le paramètre alt=media
  • Téléchargez des fichiers depuis un navigateur à l'aide de browserUrl depuis la ressource Files.

Le reste de ce guide fournit des instructions détaillées pour effectuer ces types de téléchargements via la ressource Files.

Prérequis

Pour télécharger un fichier, vous avez besoin de quelques informations:

  1. ID du rapport auquel le fichier appartient. Pour le savoir, créez un rapport ou recherchez un rapport existant.
  2. ID du fichier à télécharger. Pour le trouver, exécutez le rapport de l'étape précédente ou interrogez la liste des fichiers existants, comme dans l'exemple ci-dessous:

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        

Notez que le champ status de la ressource de fichier doit être défini sur REPORT_AVAILABLE pour pouvoir être téléchargé.

Téléchargement direct

Pour effectuer un téléchargement direct, envoyez une requête HTTP GET autorisée au service Files et incluez le paramètre de requête alt=media. Exemple de requête:

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

Notez que la réponse que vous recevez contiendra une redirection. Idéalement, votre application doit être configurée pour gérer cela automatiquement. Si vous préférez gérer cette opération manuellement, vous trouverez l'URL de redirection dans l'en-tête Location de la réponse.

La plupart des bibliothèques clientes officielles de Google proposent des méthodes pratiques pour lancer des téléchargements directs, comme illustré dans l'exemple ci-dessous. Si vous préférez lancer un téléchargement manuellement, une URL prédéfinie est fournie dans le champ apiUrl de la ressource de fichier.

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éléchargements avec reprise

Lorsque vous téléchargez des fichiers de rapport volumineux, il est possible que leur téléchargement échoue. Pour faciliter la récupération et la reprise d'un téléchargement ayant échoué, le service de fichiers est compatible avec la fonctionnalité de téléchargement partiel.

Le téléchargement partiel implique la demande de sections spécifiques d'un fichier, ce qui vous permet de décomposer les téléchargements volumineux en segments plus petits. Vous pouvez spécifier la partie d'un fichier que vous souhaitez télécharger en incluant une plage d'octets dans l'en-tête HTTP Range de votre requête. Exemple :

Range: bytes=500-999

Une fonctionnalité de téléchargement partiel est fournie par de nombreuses bibliothèques clientes via un service de téléchargement multimédia. Pour en savoir plus, consultez la documentation de la bibliothèque cliente.

Télécharger des fichiers dans un navigateur

Si vous souhaitez fournir aux utilisateurs un moyen de télécharger un fichier directement à partir de leur navigateur Web, vous pouvez utiliser l'URL fournie dans le champ browserUrl de la ressource "File". Vous pouvez rediriger un utilisateur vers cette URL ou la proposer en tant que lien cliquable. Dans les deux cas, l'utilisateur doit être connecté à un compte Google ayant accès aux rapports Campaign Manager 360 et dispose des autorisations appropriées pour accéder au fichier spécifié afin de pouvoir lancer le téléchargement.

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