API Campaign Manager 360 позволяет загружать файлы отчетов, являющиеся результатом работы инструмента Report Builder. Он также поддерживает предоставление пользователям прямого доступа к файлу по ссылке.
В зависимости от типа загрузки, которую вы хотите выполнить, вы можете использовать один из следующих способов:
- Прямая загрузка — Files.get с параметром
alt=media. - Загрузка файлов в браузере —
browserUrlиз ресурса Files.
Остальная часть этого руководства содержит подробные инструкции по выполнению подобных загрузок через ресурс «Файлы» .
Предварительные требования
Для загрузки файла вам потребуется следующая информация:
- Идентификатор отчета, к которому относится файл. Вы можете найти его, создав новый отчет или найдя существующий .
- Идентификатор файла для загрузки. Вы можете найти его, запустив отчет из предыдущего шага или запросив список существующих файлов, как в примере ниже:
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
Руби
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
Обратите внимание, что полученный ответ будет содержать перенаправление, поэтому ваше приложение в идеале должно быть настроено на автоматическую обработку этого процесса. Если вы предпочитаете обрабатывать это вручную, вы можете найти URL-адрес перенаправления в заголовке Location ответа.
Большинство официальных клиентских библиотек Google предоставляют удобные методы для запуска прямой загрузки, как показано в примере ниже. Если вы предпочитаете запустить загрузку вручную, предварительно сформированный URL-адрес предоставляется в поле apiUrl ресурса файла.
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)))
Руби
# 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
Возобновляемые загрузки
При загрузке больших файлов отчетов возможно прерывание загрузки на полпути. Для упрощения восстановления и возобновления прерванной загрузки файловая служба поддерживает функцию частичной загрузки.
Частичная загрузка предполагает запрос определенных частей файла, что позволяет разбить большие файлы на более мелкие фрагменты. Вы можете указать, какую именно часть файла вы хотите загрузить, указав диапазон байтов в заголовке HTTP Range вашего запроса. Например:
Range: bytes=500-999
Функция частичной загрузки предоставляется многими клиентскими библиотеками через сервис загрузки медиафайлов . Для получения более подробной информации обратитесь к документации клиентской библиотеки.
Загрузка файлов в браузере
Если вы хотите предоставить пользователям возможность загрузить файл непосредственно из веб-браузера, вы можете использовать URL-адрес, указанный в поле browserUrl ресурса File. Вы можете перенаправить пользователя на этот URL-адрес или предложить его в виде кликабельной ссылки. В любом случае, для начала загрузки пользователю потребуется войти в учетную запись Google с доступом к отчетам Campaign Manager 360 и иметь необходимые разрешения для доступа к указанному файлу.
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']
Руби
report_file = service.get_file(report_id, file_id)
browser_url = report_file.urls.browser_url