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 một báo cáo trong Trình tạo báo cáo. Tính năng này cũng hỗ trợ việc cung cấp cho người dùng quyền truy cập trực tiếp vào một tệp thông qua đường liên kết.
Tuỳ thuộc vào loại nội dung tải xuống mà bạn muốn thực hiện, bạn sẽ sử dụng một trong những phương pháp sau:
- Tải xuống trực tiếp – Files.get có tham số
alt=media. - Tải tệp xuống trong trình duyệt –
browserUrltừ tài nguyên Tệp.
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 các loại tải xuống này thông qua tài nguyên Tệp.
Điều kiện tiên quyết
Để tải tệp xuống, bạn cần cung cấp một số thông tin:
- Mã của báo cáo chứa tệp. Bạn có thể tìm thấy thông tin này bằng cách tạo báo cáo mới hoặc tìm kiếm một báo cáo hiện có.
- Mã nhận dạng của tệp cần tải xuống. Bạn có thể tìm thấy thông tin 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ụ bên dưới:
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 để đủ điều kiện tải xuống.
Tải xuống trực tiếp
Để thực hiện tải xuống trực tiếp, bạn sẽ thực hiện một yêu cầu HTTP GET được uỷ quyền đến dịch vụ Tệp và thêm tham số truy vấn alt=media. Một yêu cầu ví dụ có thể trô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 một lệnh chuyển hướng, vì vậy, tốt nhất là bạn nên định cấu hình ứng dụng để tự động xử lý lệnh này. Nếu muốn xử lý việc này theo cách thủ công, bạn có thể tìm thấy 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ư minh hoạ trong ví dụ bên dưới. Nếu muốn bắt đầu tải xuống theo cách thủ công, bạn có thể sử dụng URL được tạo sẵn 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 tiếp tục
Khi tải các tệp báo cáo có kích thước lớn xuống, có thể quá trình tải xuống sẽ bị lỗi ở giữa chừng. Để giúp bạn dễ dàng khôi phục và tiếp tục tải xuống khi quá trình tải xuống bị lỗi, 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 là 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 thêm một dải 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. Hãy 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 một cách để tải tệp xuống trực tiếp 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 URL này dưới dạng một đường liên kết có thể nhấp. Trong cả hai trường hợp, người dùng cần đăng nhập vào một Tài khoản Google có quyền truy cập vào báo cáo Campaign Manager 360 và có các quyền phù hợp để truy cập vào tệp được chỉ định, nhằm 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