Campaign Manager 360 API cho phép bạn tải các tệp báo cáo xuống. Đây là kết quả của việc chạy báo cáo Trình tạo báo cáo. API này cũng hỗ trợ cấp cho người dùng quyền truy cập trực tiếp vào tệp thông qua đường liên kết.
Tuỳ thuộc vào loại tệp tải xuống mà bạn muốn thực hiện, bạn sẽ sử dụng một trong các phương pháp sau:
- Tải xuống trực tiếp – Files.get với tham số
alt=media
. - Tải tệp xuống trong trình duyệt –
browserUrl
từ tài nguyên Files.
Phần còn lại của hướng dẫn này cung cấp hướng dẫn chi tiết về cách thực hiện những loại tải xuống này qua tài nguyên Tệp.
Điều kiện tiên quyết
Để tải tệp xuống, bạn sẽ cần một số thông tin:
- Mã của báo cáo chứa tệp. Bạn có thể xem báo cáo này bằng cách tạo một báo cáo mới hoặc tra cứu một báo cáo hiện có.
- Mã của tệp cần tải xuống. Bạn có thể tìm thấy tệp này bằng cách chạy báo cáo ở bước trước hoặc truy vấn danh sách các tệp hiện có như trong ví dụ dưới đây:
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
Xin lưu ý rằng bạn phải đặt trường status
của tài nguyên tệp thành REPORT_AVAILABLE
thì mới đủ điều kiện tải xuống.
Tải xuống trực tiếp
Để tải xuống trực tiếp, hãy gửi một yêu cầu HTTP GET
được uỷ quyền đến dịch vụ Files và đưa vào tham số truy vấn alt=media
. Một yêu cầu mẫu có thể có dạng như sau:
GET https://www.googleapis.com/dfareporting/v3.4/reports/12345/files/12345?alt=media HTTP/1.1 Authorization: Bearer your_auth_token
Xin lưu ý rằng phản hồi bạn nhận được sẽ chứa lệnh chuyển hướng, vì vậy, lý tưởng nhất là ứng dụng của bạn nên được định cấu hình để xử lý việc này một cách tự động. Nếu muốn xử lý thủ công, bạn có thể tìm URL chuyển hướng trong tiêu đề Location
của phản hồi.
Hầu hết thư viện ứng dụng chính thức của Google đều cung cấp các phương thức thuận tiện để bắt đầu tải xuống trực tiếp, như trong ví dụ dưới đây. Nếu bạn muốn bắt đầu quá trình tải xuống theo cách thủ công, thì URL được tạo sẵn sẽ được cung cấp trong trường apiUrl
của tài nguyên tệp.
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
Tải xuống có thể tiếp tục
Khi tải xuống các tệp báo cáo có kích thước lớn, có thể quá trình tải xuống không thực hiện được. Để giúp bạn khôi phục và tiếp tục quá trình tải xuống không thành công dễ dàng hơn, dịch vụ tệp hỗ trợ chức năng tải xuống một phần.
Tải xuống một phần bao gồm việc yêu cầu các phần cụ thể của một tệp, cho phép bạn chia các tệp tải xuống lớn thành các phần nhỏ hơn. Bạn có thể chỉ định phần nào của tệp mà bạn muốn tải xuống bằng cách đưa một phạm vi byte vào tiêu đề HTTP Range
của yêu cầu. Ví dụ:
Range: bytes=500-999
Nhiều thư viện ứng dụng cung cấp chức năng tải xuống một phần thông qua dịch vụ Tải nội dung nghe nhìn xuống. Tham khảo tài liệu về thư viện ứng dụng để biết thông tin chi tiết.
Tải tệp xuống trong trình duyệt
Nếu muốn cung cấp cho người dùng cách tải tệp xuống ngay từ trình duyệt web của họ, bạn có thể sử dụng URL được cung cấp trong trường browserUrl
của tài nguyên tệp. Bạn có thể chuyển hướng người dùng đến URL này hoặc cung cấp dưới dạng một đường liên kết có thể nhấp vào. Trong cả hai trường hợp, người dùng đều phải đăng nhập vào Tài khoản Google có quyền truy cập vào báo cáo Campaign Manager 360 và có quyền phù hợp để truy cập vào tệp được chỉ định thì mới có thể bắt đầu tải xuống.
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