Mit der Campaign Manager 360 API können Sie Berichtsdateien herunterladen, die das Ergebnis der Ausführung eines Report Builder-Berichts sind. Außerdem können Sie Nutzern über einen Link direkten Zugriff auf eine Datei gewähren.
Je nach Art des Downloads verwenden Sie einen der folgenden Ansätze:
- Direkter Download: Files.get mit dem
alt=mediaParameter. - Dateien in einem Browser herunterladen:
browserUrlaus der Ressource „Files“.
Im Rest dieser Anleitung finden Sie eine detaillierte Anleitung zum Ausführen dieser Arten von Downloads über die Ressource „Files“.
Vorbereitung
Zum Herunterladen einer Datei benötigen Sie einige Informationen:
- Die ID des Berichts, zu dem die Datei gehört. Sie finden sie, indem Sie einen neuen Bericht erstellen oder einen vorhandenen Bericht suchen.
- Die ID der herunterzuladenden Datei. Sie finden sie, indem Sie den Bericht ausführen aus dem vorherigen Schritt ausführen oder die Liste der vorhandenen Dateien abfragen, wie im folgenden Beispiel:
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=str(profile_id), reportId=str(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
Das Feld status der Dateiressource muss auf REPORT_AVAILABLE gesetzt sein, damit die Datei heruntergeladen werden kann.
Direkter Download
Für einen direkten Download senden Sie eine autorisierte HTTP-GET-Anfrage an den Dienst „Files“ und fügen den Abfrageparameter alt=media ein. Eine Beispielanfrage könnte so aussehen:
GET https://www.googleapis.com/dfareporting/v5/reports/12345/files/12345?alt=media HTTP/1.1 Authorization: Bearer your_auth_token
Die Antwort enthält eine Weiterleitung. Ihre Anwendung sollte daher idealerweise so konfiguriert sein, dass sie diese automatisch verarbeitet. Wenn Sie dies manuell tun möchten, finden Sie die Weiterleitungs-URL im Location-Header der Antwort.
Die meisten offiziellen Google Clientbibliotheken bieten praktische Methoden zum Starten eines direkten Downloads, wie im folgenden Beispiel gezeigt. Wenn Sie einen Download manuell starten möchten, finden Sie im Feld apiUrl der Dateiressource eine vorgefertigte 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 not download_finished:
_, 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
Fortsetzbare Downloads
Beim Herunterladen großer Berichtsdateien kann es vorkommen, dass der Download mittendrin fehlschlägt. Um die Wiederherstellung und Fortsetzung eines fehlgeschlagenen Downloads zu erleichtern, unterstützt der Dateidienst die Funktion für teilweise Downloads.
Bei einem teilweisen Download werden bestimmte Teile einer Datei angefordert, sodass Sie große Downloads in kleinere Teile aufteilen können. Sie können angeben, welchen Teil einer Datei Sie herunterladen möchten, indem Sie einen Bytebereich in den HTTP-Header Range Ihrer Anfrage einfügen. Beispiel:
Range: bytes=500-999
Die Funktion für teilweise Downloads wird von vielen Clientbibliotheken über einen Media Download-Dienst bereitgestellt. Weitere Informationen finden Sie in der Dokumentation der Clientbibliothek.
Dateien in einem Browser herunterladen
Wenn Sie Nutzern die Möglichkeit geben möchten, eine Datei direkt über ihren Webbrowser herunterzuladen, können Sie die URL verwenden, die im Feld browserUrl der Ressource „File“ angegeben ist. Sie können einen Nutzer zu dieser URL weiterleiten oder sie als anklickbaren Link anbieten. In beiden Fällen muss der Nutzer in einem Google-Konto angemeldet sein, das Zugriff auf die Campaign Manager 360-Berichterstellung hat, und die entsprechenden Berechtigungen für den Zugriff auf die angegebene Datei haben, um den Download zu starten.
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=str(report_id), fileId=str(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