보고서 파일 다운로드

Campaign Manager 360 API를 사용하면 보고서 작성 도구 보고서를 실행한 결과를 나타내는 보고서 파일을 다운로드할 수 있습니다. 또한 링크를 통해 사용자에게 파일에 대한 직접 액세스 권한을 제공하는 것도 지원합니다.

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

  • 직접 다운로드: alt=media 매개변수를 사용하는 Files.get
  • 브라우저에서 파일 다운로드: Files 리소스의 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로 설정되어 있어야 합니다.

직접 다운로드

직접 다운로드를 실행하려면 Files 서비스에 승인된 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

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

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

사용자가 웹브라우저에서 직접 파일을 다운로드할 수 있는 방법을 제공하려면 File 리소스의 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