Interfejs Campaign Manager 360 API umożliwia pobieranie plików raportów będących wynikiem generowania raportu w Kreatorze raportów. Zapewnia też bezpośredni dostęp do pliku za pomocą linku.
W zależności od rodzaju pobierania, który chcesz wykonać, możesz użyć jednej z tych metod:
- Pobieranie bezpośrednie – plik Files.get z parametrem
alt=media
. - Pobierz pliki w przeglądarce –
browserUrl
z zasobu Files.
W pozostałej części tego przewodnika znajdziesz szczegółowe instrukcje pobierania plików tego typu za pomocą zasobu Pliki.
Wymagania wstępne
Aby pobrać plik, musisz podać kilka informacji:
- Identyfikator raportu, do którego należy plik. Aby go znaleźć, utwórz nowy raport lub wyszukaj istniejący raport.
- Identyfikator pliku do pobrania. Aby go znaleźć, wygeneruj raport z poprzedniego kroku lub utwórz zapytanie o listę dotychczasowych plików, tak jak w tym przykładzie:
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
Aby można było pobrać plik, pole status
zasobu musi mieć wartość REPORT_AVAILABLE
.
Pobieranie bezpośrednie
Aby wykonać bezpośrednie pobieranie, wyślij do usługi Files autoryzowane żądanie HTTP GET
i dołącz parametr zapytania alt=media
. Przykładowe żądanie może wyglądać tak:
GET https://www.googleapis.com/dfareporting/v3.4/reports/12345/files/12345?alt=media HTTP/1.1 Authorization: Bearer your_auth_token
Pamiętaj jednak, że odpowiedź będzie zawierać przekierowanie, więc Twoja aplikacja powinna być skonfigurowana do obsługi tej funkcji automatycznie. Jeśli wolisz obsługiwać ją ręcznie, adres URL przekierowania znajdziesz w nagłówku Location
odpowiedzi.
Większość oficjalnych bibliotek klienta Google umożliwia wygodne rozpoczęcie pobierania bezpośredniego (jak pokazano w przykładzie poniżej). Jeśli wolisz inicjować pobieranie ręcznie, w polu apiUrl
zasobu pliku podany jest wstępnie utworzony 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);
}
}
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
Pobieranie możliwe do wznowienia
Podczas pobierania dużych plików raportów może się nie udać. Aby ułatwić przywrócenie i wznowić pobieranie, usługa pliku obsługuje częściową funkcję pobierania.
Pobieranie częściowe obejmuje pobieranie określonych części pliku, co umożliwia podział dużych plików na mniejsze części. Możesz określić, którą część pliku chcesz pobrać, podając zakres bajtów w nagłówku HTTP żądania Range
. Na przykład:
Range: bytes=500-999
Funkcja pobierania częściowych jest dostępna w wielu bibliotekach klientów za pomocą usługi pobierania multimediów. Szczegółowe informacje znajdziesz w dokumentacji biblioteki klienta.
Pobieranie plików w przeglądarce
Jeśli chcesz umożliwić użytkownikom pobieranie pliku bezpośrednio z przeglądarki, możesz użyć adresu URL podanego w polu browserUrl
zasobu pliku. Możesz przekierować użytkownika do tego adresu URL lub zaoferować mu go jako link, który można kliknąć. W obu przypadkach użytkownik będzie musiał zalogować się na konto Google z dostępem do raportów Campaign Managera 360 i mieć odpowiednie uprawnienia dostępu do określonego pliku, aby można było rozpocząć pobieranie.
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