Campaign Manager 360 API memungkinkan Anda mendownload file laporan, yang merupakan hasil dari menjalankan laporan Pembuat Laporan. Ini juga mendukung penyediaan akses langsung ke file melalui link kepada pengguna.
Tergantung pada jenis download yang ingin Anda lakukan, Anda akan menggunakan salah satu pendekatan berikut:
- Download langsung — Files.get dengan parameter
alt=media
. - Download file di browser —
browserUrl
dari resource File.
Bagian lainnya dalam panduan ini memberikan petunjuk terperinci untuk melakukan jenis download ini melalui resource Files.
Prasyarat
Untuk mendownload file, Anda memerlukan beberapa informasi:
- ID laporan tempat file berada. Anda dapat menemukannya dengan membuat laporan baru, atau mencari laporan yang ada.
- ID file untuk didownload. Anda dapat menemukannya dengan menjalankan laporan dari langkah sebelumnya, atau membuat kueri untuk file yang ada seperti dalam contoh di bawah:
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
Perhatikan bahwa kolom status
dari resource file harus disetel ke REPORT_AVAILABLE
agar memenuhi syarat untuk didownload.
Download langsung
Untuk melakukan download langsung, buat permintaan GET
HTTP yang sah ke layanan File dan sertakan parameter kueri alt=media
. Contoh permintaan akan terlihat seperti ini:
GET https://www.googleapis.com/dfareporting/v3.4/reports/12345/files/12345?alt=media HTTP/1.1 Authorization: Bearer your_auth_token
Perlu diketahui bahwa respons yang Anda terima akan berisi pengalihan, sehingga idealnya aplikasi Anda harus dikonfigurasi untuk menangani hal ini secara otomatis. Jika memilih untuk menangani hal ini secara manual, Anda dapat menemukan URL alihan di header Location
pada respons.
Sebagian besar library klien Google resmi menyediakan metode praktis untuk memulai download langsung, seperti yang ditunjukkan dalam contoh di bawah. Jika Anda memilih untuk memulai download secara manual, URL yang telah dibuat akan disediakan di kolom apiUrl
pada resource file.
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
Download yang dapat dilanjutkan
Saat mendownload file laporan berukuran besar, download mungkin gagal di tengah proses. Untuk memudahkan pemulihan dan melanjutkan download yang gagal, layanan file mendukung fungsi download sebagian.
Proses download sebagian melibatkan permintaan bagian file tertentu, yang memungkinkan Anda membagi download menjadi potongan-potongan yang lebih kecil. Anda dapat menentukan bagian file yang ingin didownload dengan menyertakan rentang byte dalam header HTTP Range
permintaan Anda. Contoh:
Range: bytes=500-999
Fungsi download sebagian disediakan oleh banyak library klien melalui layanan Download Media. Baca dokumentasi library klien untuk mengetahui detailnya.
Mendownload file di browser
Jika ingin memberi pengguna cara mendownload file langsung dari browser web, Anda dapat menggunakan URL yang disediakan di kolom browserUrl
pada resource File. Anda dapat mengalihkan pengguna ke URL ini, atau menawarkannya sebagai link yang dapat diklik. Dalam kedua kasus tersebut, pengguna harus login ke Akun Google dengan akses ke pelaporan Campaign Manager 360 dan memiliki izin yang benar untuk mengakses file yang ditentukan, agar dapat memulai download.
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