Загрузить файлы отчетов, Загрузить файлы отчетов

API Менеджера кампаний 360 позволяет загружать файлы отчетов, которые являются результатом запуска отчета Report Builder. Он также поддерживает предоставление пользователям прямого доступа к файлу по ссылке.

В зависимости от типа загрузки, которую вы хотите выполнить, вы можете использовать один из следующих подходов:

  • Прямая загрузка — Files.get с параметром alt=media .
  • Загрузка файлов в браузере — browserUrl с ресурса Files.

Остальная часть этого руководства содержит подробные инструкции по выполнению этих типов загрузок через ресурс Files .

Предварительные условия

Чтобы скачать файл, вам понадобится несколько фрагментов информации:

  1. Идентификатор отчета, которому принадлежит файл. Вы можете найти это , создав новый отчет или выполнив поиск существующего отчета .
  2. Идентификатор файла для загрузки. Вы можете найти это , запустив отчет из предыдущего шага или запросив список существующих файлов, как показано в примере ниже:

С#

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));

Ява

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));

Питон

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

Руби

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        

Обратите внимание, что для того, чтобы его можно было загрузить, в поле status файлового ресурса должно быть установлено значение REPORT_AVAILABLE .

Прямая загрузка

Чтобы выполнить прямую загрузку, вы отправляете авторизованный запрос HTTP GET к службе файлов и включаете параметр запроса alt=media . Пример запроса может выглядеть так:

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

Имейте в виду, что полученный ответ будет содержать перенаправление, поэтому в идеале ваше приложение должно быть настроено на автоматическую обработку этого. Если вы предпочитаете обрабатывать это вручную, вы можете найти URL-адрес перенаправления в заголовке Location ответа.

Большинство официальных клиентских библиотек Google предоставляют удобные методы для запуска прямой загрузки, как показано в примере ниже. Если вы предпочитаете инициировать загрузку вручную, в поле apiUrl файлового ресурса предоставляется предварительно созданный URL-адрес.

С#

// 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);
  }
}

Ява

// 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);
    }
}

Питон

# 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)))

Руби

# 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

Возобновляемые загрузки

При загрузке больших файлов отчетов загрузка может прерваться на полпути. Чтобы упростить восстановление и возобновление неудачной загрузки, файловая служба поддерживает функцию частичной загрузки.

Частичная загрузка предполагает запрос определенных частей файла, что позволяет разбивать большие загрузки на более мелкие фрагменты. Вы можете указать, какую часть файла вы хотите загрузить, включив диапазон байтов в HTTP-заголовок Range вашего запроса. Например:

Range: bytes=500-999

Функциональность частичной загрузки предоставляется многими клиентскими библиотеками через службу загрузки мультимедиа . Подробности смотрите в документации клиентской библиотеки.

Загрузка файлов в браузере

Если вы хотите предоставить пользователям возможность загружать файл непосредственно из их веб-браузера, вы можете использовать URL-адрес, указанный в поле browserUrl ресурса File. Вы можете перенаправить пользователя на этот URL-адрес или предложить его в виде кликабельной ссылки. В любом случае, чтобы начать загрузку, пользователю необходимо войти в учетную запись Google с доступом к отчетам Campaign Manager 360 и иметь правильные разрешения на доступ к указанному файлу.

С#

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

Ява

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();

Питон

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

Руби

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