Rapor Dosyalarını İndir

Campaign Manager 360 API, Rapor Oluşturucu raporunun çalıştırılması sonucunda oluşturulan rapor dosyalarını indirmenize olanak tanır. Ayrıca, kullanıcıların bağlantı üzerinden bir dosyaya doğrudan erişim sağlamasını da destekler.

Gerçekleştirmek istediğiniz indirme türüne bağlı olarak, aşağıdaki yaklaşımlardan birini kullanırsınız:

  • Doğrudan indirme — alt=media parametresiyle birlikte Files.get.
  • Dosyaları bir tarayıcıda indirin — Dosyalar kaynağından browserUrl.

Bu kılavuzun geri kalanında, Dosya kaynağı aracılığıyla bu tür indirmelerin gerçekleştirilmesine ilişkin ayrıntılı talimatlar sağlanmaktadır.

Ön koşullar

Bir dosyayı indirmek için bazı bilgilere ihtiyacınız olacaktır:

  1. Dosyanın ait olduğu raporun kimliği. Bu bilgiyi, yeni bir rapor oluşturarak veya mevcut bir raporu arayarak bulabilirsiniz.
  2. İndirilecek dosyanın kimliği. Bu sayfaya, önceki adımda yer alan raporu çalıştırarak veya mevcut dosyaların listesini aşağıdaki örnekte olduğu gibi sorgulayarak ulaşabilirsiniz:

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        

İndirmeye uygun olması için dosya kaynağının status alanının REPORT_AVAILABLE olarak ayarlanması gerektiğini unutmayın.

Doğrudan indirme

Doğrudan indirme işlemi gerçekleştirmek için Dosyalar hizmetine yetkili bir HTTP GET isteği gönderir ve sorgu parametresini alt=media eklersiniz. Örnek istek aşağıdaki gibi görünebilir:

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

Aldığınız yanıtın bir yönlendirme içereceğini unutmayın. Bu nedenle, uygulamanızın ideal olarak bunu otomatik olarak işleyecek şekilde yapılandırılması gerekir. Bunu manuel olarak işlemeyi tercih ederseniz yönlendirme URL'sini yanıtın Location başlığında bulabilirsiniz.

Aşağıdaki örnekte gösterildiği gibi, resmi Google istemci kitaplıklarının çoğu doğrudan indirme işlemini başlatmak için kolaylık yöntemleri sunar. Bir indirme işlemini manuel olarak başlatmayı tercih ederseniz dosya kaynağının apiUrl alanında önceden oluşturulmuş bir URL sağlanır.

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

Devam ettirilebilir indirmeler

Büyük rapor dosyaları indirilirken, indirme işlemi yarıda başarısız olabilir. Dosya hizmeti, başarısız bir indirme işlemini kurtarmayı ve devam ettirmeyi kolaylaştırmak için kısmi indirme işlevini destekler.

Kısmi indirme, bir dosyanın belirli bölümlerinin istenmesini içerir. Bu, büyük indirmeleri daha küçük parçalara ayırmanıza olanak tanır. İsteğinizin Range HTTP başlığına bir bayt aralığı ekleyerek dosyanın hangi bölümünü indirmek istediğinizi belirtebilirsiniz. Örneğin:

Range: bytes=500-999

Kısmi indirme işlevi, birçok istemci kitaplığı tarafından bir Medya İndirme hizmeti aracılığıyla sağlanır. Ayrıntılar için istemci kitaplığı belgelerine bakın.

Tarayıcıda dosya indirme

Kullanıcılara, doğrudan web tarayıcılarından dosya indirmeleri için bir yöntem sağlamak istiyorsanız Dosya kaynağının browserUrl alanında sağlanan URL'yi kullanabilirsiniz. Kullanıcıları bu URL'ye yönlendirebilir veya tıklanabilir bağlantı olarak sunabilirsiniz. Her iki durumda da, indirme işlemini başlatmak için kullanıcının, Campaign Manager 360 raporlarına erişimi olan bir Google hesabına giriş yapması ve belirtilen dosyaya erişmek için doğru izinlere sahip olması gerekir.

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