보고서 파일 다운로드

Campaign Manager 360 API를 사용하면 보고서 작성 도구 실행의 결과로 생성되는 보고서 파일을 다운로드할 수 있습니다. 또한 사용자가 링크를 통해 파일에 직접 액세스할 수 있도록 지원합니다.

수행하려는 다운로드 유형에 따라 다음 방법 중 하나를 사용합니다.

  • 직접 다운로드: alt=media 매개변수가 포함된 Files.get
  • 브라우저에서 파일 다운로드 — 파일 리소스의 browserUrl

이 가이드의 나머지 부분에서는 파일 리소스를 통해 이러한 유형의 다운로드를 수행하는 자세한 방법을 안내합니다.

기본 요건

파일을 다운로드하려면 몇 가지 정보가 필요합니다.

  1. 파일이 속한 보고서의 ID입니다. 새 보고서를 만들거나 기존 보고서를 조회하여 이 정보를 찾을 수 있습니다.
  2. 다운로드할 파일의 ID입니다. 이전 단계에서 보고서를 실행하거나 아래 예와 같이 기존 파일 목록을 쿼리하여 이를 찾을 수 있습니다.

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

자바

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        

파일 리소스의 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

수신하는 응답에는 리디렉션이 포함되므로 애플리케이션이 리디렉션을 자동으로 처리하도록 구성하는 것이 좋습니다. 수동으로 처리하려는 경우 응답의 Location 헤더에서 리디렉션 URL을 찾을 수 있습니다.

대부분의 공식 Google 클라이언트 라이브러리에서는 아래 예와 같이 직접 다운로드를 시작할 수 있는 편의 메서드를 제공합니다. 수동으로 다운로드를 시작하려는 경우 파일 리소스의 apiUrl 필드에 미리 구성된 URL이 제공됩니다.

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

자바

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

재개 가능한 다운로드

대용량 보고서 파일을 다운로드하는 경우 중간에 다운로드가 실패할 수 있습니다. 실패한 다운로드를 쉽게 복구하고 재개할 수 있도록 파일 서비스는 부분 다운로드 기능을 지원합니다.

부분 다운로드에는 파일의 특정 부분을 요청해야 하므로 대용량 다운로드를 더 작은 청크로 나눌 수 있습니다. 요청의 Range HTTP 헤더에 바이트 범위를 포함하여 파일의 어느 부분을 다운로드할지 지정할 수 있습니다. 예를 들면 다음과 같습니다.

Range: bytes=500-999

부분 다운로드 기능은 많은 클라이언트 라이브러리에서 미디어 다운로드 서비스를 통해 제공됩니다. 자세한 내용은 클라이언트 라이브러리 문서를 참조하세요.

브라우저에서 파일 다운로드하기

사용자에게 웹브라우저에서 직접 파일을 다운로드하는 방법을 제공하려면 파일 리소스의 browserUrl 필드에 제공된 URL을 사용하면 됩니다. 사용자를 이 URL로 리디렉션하거나 클릭 가능한 링크로 제공할 수 있습니다. 두 경우 모두 다운로드를 시작하려면 사용자가 Campaign Manager 360 보고서에 액세스할 수 있는 Google 계정에 로그인해야 하며 지정된 파일에 액세스할 수 있는 올바른 권한이 있어야 합니다.

C#

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

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