دانلود فایل های گزارش

Campaign Manager 360 API به شما امکان دانلود فایل های گزارش را می دهد که نتیجه اجرای گزارش 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 مجاز به سرویس Files می‌دهید و پارامتر query 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 روش های راحتی را برای شروع دانلود مستقیم ارائه می دهند، همانطور که در مثال زیر نشان داده شده است. اگر ترجیح می دهید بارگیری را به صورت دستی شروع کنید، یک URL از پیش ساخته شده در قسمت apiUrl منبع فایل ارائه می شود.

سی شارپ

// 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

دانلودهای قابل ازسرگیری

هنگام بارگیری فایل های گزارش بزرگ، ممکن است بارگیری تا حدودی با شکست مواجه شود. برای سهولت بازیابی و از سرگیری دانلود ناموفق، سرویس فایل از قابلیت دانلود جزئی پشتیبانی می کند.

دانلود جزئی شامل درخواست بخش های خاصی از یک فایل است که به شما امکان می دهد دانلودهای بزرگ را به قطعات کوچکتر تقسیم کنید. می‌توانید با گنجاندن یک محدوده بایت در هدر Range HTTP درخواست خود، مشخص کنید کدام قسمت از فایلی را می‌خواهید دانلود کنید. مثلا:

Range: bytes=500-999

قابلیت دانلود جزئی توسط بسیاری از کتابخانه های سرویس گیرنده از طریق سرویس دانلود رسانه ارائه می شود. برای جزئیات بیشتر به مستندات کتابخانه مشتری مراجعه کنید.

دانلود فایل ها در مرورگر

اگر می خواهید راهی برای دانلود مستقیم فایل از مرورگر وب خود به کاربران ارائه دهید، می توانید از URL ارائه شده در قسمت browserUrl منبع فایل استفاده کنید. می توانید یک کاربر را به این 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