Saat mengunduh objek besar lebih dari 5 GB dari Object Storage Service (OSS) ke komputer lokal, Anda mungkin gagal karena gangguan jaringan atau kerusakan program. Jika pengunduhan tetap gagal setelah beberapa percobaan, gunakan fitur unduhan yang dapat dilanjutkan. Objek dapat dibagi menjadi beberapa bagian untuk diunduh secara paralel, mempercepat proses. Kemajuan unduhan dicatat dalam file checkpoint. Jika salah satu bagian gagal diunduh, proses akan dilanjutkan dari posisi terakhir yang tercatat. Setelah semua bagian selesai, bagian-bagian tersebut digabungkan menjadi satu objek lengkap.
Prasyarat
Mengunduh objek Arsip: Pastikan objek Arsip telah dipulihkan atau akses real-time ke objek Arsip telah diaktifkan untuk bucket penyimpanan. Untuk detail lebih lanjut, lihat Pulihkan objek dan Akses real-time objek Arsip.
Mengunduh objek Cold Archive atau Deep Cold Archive: Pastikan objek Cold Archive atau Deep Cold Archive telah dipulihkan. Untuk informasi lebih lanjut, lihat Pulihkan objek.
Catatan Penggunaan
Unduhan yang dapat dilanjutkan hanya dapat dilakukan menggunakan SDK OSS. Perhatikan hal-hal berikut saat melakukan unduhan:
Dalam topik ini, endpoint publik wilayah China (Hangzhou) digunakan. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan endpoint internal. Untuk informasi lebih lanjut tentang wilayah dan endpoint OSS, lihat Wilayah dan Endpoint.
Dalam topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang konfigurasi kredensial akses, lihat Konfigurasi Kredensial Akses.
Dalam topik ini, instance OSSClient dibuat menggunakan endpoint OSS. Jika Anda ingin membuat instance OSSClient dengan nama domain kustom atau Security Token Service (STS), lihat Konfigurasi Instance OSSClient.
Untuk menggunakan unduhan yang dapat dilanjutkan, Anda harus memiliki izin
oss:GetObject. Untuk informasi lebih lanjut, lihat Lampirkan kebijakan kustom ke pengguna RAM.SDK OSS mencatat kemajuan unduhan dalam file checkpoint. Pastikan Anda memiliki izin menulis pada file checkpoint.
Jangan modifikasi checksum yang terkandung dalam file checkpoint. Jika file checkpoint rusak, Anda perlu mengunduh semua bagian kembali.
Jika ETag objek tidak konsisten atau bagian hilang atau dimodifikasi selama pengunduhan, Anda perlu mengunduh objek kembali.
Gunakan SDK OSS
Contoh kode berikut menunjukkan cara melakukan unduhan yang dapat dilanjutkan menggunakan SDK OSS untuk bahasa pemrograman umum. Untuk informasi lebih lanjut tentang cara melakukan unduhan yang dapat dilanjutkan dengan SDK OSS untuk bahasa pemrograman lainnya, lihat Ikhtisar.
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
public class Demo {
public static void main(String[] args) throws Exception {
// Dalam contoh ini, endpoint wilayah China (Hangzhou) digunakan. Tentukan endpoint aktual Anda.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur penuh objek. Contoh: exampledir/exampleobject.txt. Jangan sertakan nama bucket dalam jalur penuh.
String objectName = "exampledir/exampleobject.txt";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
String region = "cn-hangzhou";
// Buat instance OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya terkait ketika OSSClient tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Lakukan unduhan yang dapat dilanjutkan di mana 10 bagian dapat diunduh secara bersamaan.
DownloadFileRequest downloadFileRequest = new DownloadFileRequest(bucketName, objectName);
// Tentukan jalur penuh ke mana Anda ingin mengunduh objek. Contoh: D:\\localpath\\examplefile.txt.
downloadFileRequest.setDownloadFile("D:\\localpath\\examplefile.txt");
// Tentukan ukuran bagian. Satuan: byte. Nilai valid: 100 KB hingga 5 GB. Ukuran bagian default adalah 100 KB.
downloadFileRequest.setPartSize(1 * 1024 * 1024);
// Tentukan jumlah thread konkuren untuk tugas unduhan yang dapat dilanjutkan. Nilai default: 1.
downloadFileRequest.setTaskNum(10);
// Tentukan apakah akan mengaktifkan unduhan yang dapat dilanjutkan. Secara default, unduhan yang dapat dilanjutkan dinonaktifkan.
downloadFileRequest.setEnableCheckpoint(true);
// Tentukan jalur penuh file checkpoint. Contoh: D:\\localpath\\examplefile.txt.dcp.
// File checkpoint dibuat saat unduhan terganggu. Jika Anda ingin melanjutkan tugas unduhan, Anda harus menentukan jalur penuh file checkpoint. Setelah objek diunduh, file checkpoint dihapus.
//downloadFileRequest.setCheckpointFile("D:\\localpath\\examplefile.txt.dcp");
// Unduh objek.
DownloadFileResult downloadRes = ossClient.downloadFile(downloadFileRequest);
// Setelah objek diunduh, metadata objek dikembalikan.
ObjectMetadata objectMetadata = downloadRes.getObjectMetadata();
System.out.println(objectMetadata.getETag());
System.out.println(objectMetadata.getLastModified());
System.out.println(objectMetadata.getUserMetadata().get("meta"));
} catch (OSSException oe) {
System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
+ "tetapi ditolak dengan respons kesalahan karena alasan tertentu.");
System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
System.out.println("Kode Kesalahan:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("ID Host:" + oe.getHostId());
} catch (Throwable ce) {
System.out.println("Tangkap ClientException, yang berarti klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Kesalahan:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}import argparse
import alibabacloud_oss_v2 as oss
# Buat parser untuk mem-parsing argumen baris perintah dan jelaskan tujuan skrip.
parser = argparse.ArgumentParser(description="contoh unduhan file")
# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan endpoint wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib.
parser.add_argument('--key', help='Nama objek.', required=True)
# Tentukan parameter --file_path untuk menunjukkan jalur ke mana objek diunduh. Parameter ini wajib. Contoh: "/Users/yourLocalPath/yourFileName"
parser.add_argument('--file_path', help='Jalur untuk menyimpan file yang diunduh.', required=True)
def main():
# Parse argumen baris perintah untuk mendapatkan nilai-nilai yang ditentukan.
args = parser.parse_args()
# Muat informasi autentikasi yang diperlukan untuk mengakses OSS dari variabel lingkungan.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Gunakan konfigurasi default untuk membuat objek konfigurasi dan tentukan penyedia kredensial.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Tentukan atribut region objek konfigurasi berdasarkan parameter baris perintah yang diberikan oleh pengguna.
cfg.region = args.region
# Jika endpoint kustom diberikan, perbarui atribut endpoint objek cfg dengan endpoint yang diberikan.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Gunakan konfigurasi sebelumnya untuk menginisialisasi instance OSSClient dan izinkan instance tersebut berinteraksi dengan OSS.
client = oss.Client(cfg)
# Buat downloader dan tentukan opsi lanjutan.
downloader = client.downloader(
use_temp_file=True, # Aktifkan penggunaan file sementara.
enable_checkpoint=True, # Aktifkan unduhan yang dapat dilanjutkan.
checkpoint_dir=args.file_path, # Tentukan direktori tempat file checkpoint disimpan.
verify_data=True # Tentukan verifikasi data.
)
# Panggil metode untuk mengunduh objek.
result = downloader.download_file(
oss.GetObjectRequest(
bucket=args.bucket, # Tentukan nama bucket.
key=args.key, # Tentukan nama objek yang akan diunduh.
),
filepath=args.file_path # Tentukan jalur file lokal ke mana objek diunduh.
)
# Tampilkan hasil, termasuk jumlah byte yang ditulis.
print(f'ditulis: {result.written}')
# Panggil fungsi utama untuk memulai logika pemrosesan saat skrip dijalankan langsung.
if __name__ == "__main__":
main() # Titik masuk skrip, alur program dimulai di sinipackage main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// Tentukan variabel global.
var (
region string // Wilayah tempat bucket berada.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Gunakan fungsi init untuk menginisialisasi parameter.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "src-object", "", "Nama objek sumber.")
}
func main() {
// Parse parameter.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama bucket diperlukan")
}
// Periksa apakah wilayah kosong.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, wilayah diperlukan")
}
// Periksa apakah nama objek sumber kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama objek sumber diperlukan")
}
// Buat konfigurasi klien OSS.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat Downloader.
d := client.NewDownloader()
// Buat permintaan untuk mengunduh objek.
request := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName), // Nama bucket.
Key: oss.Ptr(objectName), // Nama objek.
}
// Jalur file lokal.
localFile := "local-file"
// Tentukan opsi downloader.
downloaderOptions := func(do *oss.DownloaderOptions) {
do.EnableCheckpoint = true // Aktifkan pencatatan checkpoint.
do.CheckpointDir = "./checkpoint" // Tentukan jalur file checkpoint.
do.UseTempFile = true // Tentukan penggunaan file sementara.
}
// Eksekusi permintaan untuk mengunduh objek.
result, err := d.DownloadFile(context.TODO(), request, localFile, downloaderOptions)
if err != nil {
log.Fatalf("gagal mengunduh file %v", err)
}
// Cetak respons sukses.
log.Printf("unduh file %s ke local-file berhasil, ukuran: %d", objectName, result.Written)
}
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Tentukan nama bucket. Contoh: examplebucket.
var bucketName = "examplebucket";
// Tentukan jalur penuh objek. Jangan sertakan nama bucket dalam jalur penuh. Contoh: exampledir/exampleobject.txt.
var objectName = "exampleobject.txt";
// Unduh objek ke D:\\localpath. Setelah objek diunduh, file lokal diberi nama examplefile.txt. Jika file dengan nama yang sama sudah ada, objek yang diunduh akan menimpa file tersebut. Jika tidak, objek yang diunduh disimpan di jalur tersebut.
// Jika Anda tidak menentukan jalur untuk objek yang diunduh, objek yang diunduh disimpan ke jalur proyek tempat program contoh milik.
var downloadFilename = "D:\\localpath\\examplefile.txt";
// Tentukan jalur penuh file checkpoint. Contoh: D:\\localpath\\examplefile.txt.dcp.
// File checkpoint dibuat saat unduhan terganggu. Jika Anda ingin melanjutkan tugas unduhan, Anda harus menentukan jalur penuh file checkpoint. Setelah objek diunduh, file checkpoint dihapus.
var checkpointDir = "D:\\localpath\\examplefile.txt.dcp";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instance ClientConfiguration dan modifikasi parameter default berdasarkan kebutuhan Anda.
var conf = new ClientConfiguration();
// Gunakan algoritma tanda tangan V4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instance OSSClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// Konfigurasikan beberapa parameter menggunakan DownloadObjectRequest.
DownloadObjectRequest request = new DownloadObjectRequest(bucketName, objectName, downloadFilename)
{
// Tentukan ukuran setiap bagian untuk diunduh. Satuan: byte.
PartSize = 8 * 1024 * 1024,
// Tentukan jumlah thread konkuren.
ParallelThreadCount = 3,
// checkpointDir adalah file yang digunakan untuk menyimpan informasi tentang kemajuan unduhan yang dapat dilanjutkan. Jika sebuah bagian gagal diunduh, Anda dapat melanjutkan tugas unduhan berdasarkan kemajuan yang tercatat dalam file checkpointDir. Jika Anda mengatur checkpointDir ke null, unduhan yang dapat dilanjutkan tidak berlaku dan objek diunduh ulang jika gagal diunduh.
CheckpointDir = checkpointDir,
};
// Mulai unduhan yang dapat dilanjutkan.
client.ResumableDownloadObject(request);
Console.WriteLine("Unduhan objek yang dapat dilanjutkan:{0} berhasil", objectName);
}
catch (OssException ex)
{
Console.WriteLine("Gagal dengan kode kesalahan: {0}; Info kesalahan: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Gagal dengan info kesalahan: {0}", ex.Message);
}#import "DownloadService.h"
#import "OSSTestMacros.h"
@implementation DownloadRequest
@end
@implementation Checkpoint
- (instancetype)copyWithZone:(NSZone *)zone {
Checkpoint *other = [[[self class] allocWithZone:zone] init];
other.etag = self.etag;
other.totalExpectedLength = self.totalExpectedLength;
return other;
}
@end
@interface DownloadService()<NSURLSessionTaskDelegate, NSURLSessionDataDelegate>
@property (nonatomic, strong) NSURLSession *session; // Sesi jaringan.
@property (nonatomic, strong) NSURLSessionDataTask *dataTask; // Tugas permintaan data.
@property (nonatomic, copy) DownloadFailureBlock failure; // Kegagalan permintaan.
@property (nonatomic, copy) DownloadSuccessBlock success; // Keberhasilan permintaan.
@property (nonatomic, copy) DownloadProgressBlock progress; // Kemajuan unduhan.
@property (nonatomic, copy) Checkpoint *checkpoint; // Checkpoint.
@property (nonatomic, copy) NSString *requestURLString; // URL sumber daya objek yang digunakan dalam permintaan unduhan.
@property (nonatomic, copy) NSString *headURLString; // URL sumber daya objek yang digunakan dalam permintaan HEAD.
@property (nonatomic, copy) NSString *targetPath; // Jalur tempat objek disimpan.
@property (nonatomic, assign) unsigned long long totalReceivedContentLength; // Ukuran konten yang diunduh.
@property (nonatomic, strong) dispatch_semaphore_t semaphore;
@end
@implementation DownloadService
- (instancetype)init
{
self = [super init];
if (self) {
NSURLSessionConfiguration *conf = [NSURLSessionConfiguration defaultSessionConfiguration];
conf.timeoutIntervalForRequest = 15;
NSOperationQueue *processQueue = [NSOperationQueue new];
_session = [NSURLSession sessionWithConfiguration:conf delegate:self delegateQueue:processQueue];
_semaphore = dispatch_semaphore_create(0);
_checkpoint = [[Checkpoint alloc] init];
}
return self;
}
// DownloadRequest adalah inti dari logika unduhan.
+ (instancetype)downloadServiceWithRequest:(DownloadRequest *)request {
DownloadService *service = [[DownloadService alloc] init];
if (service) {
service.failure = request.failure;
service.success = request.success;
service.requestURLString = request.sourceURLString;
service.headURLString = request.headURLString;
service.targetPath = request.downloadFilePath;
service.progress = request.downloadProgress;
if (request.checkpoint) {
service.checkpoint = request.checkpoint;
}
}
return service;
}
/**
* Dapatkan informasi objek dengan menggunakan metode HEAD. OSS membandingkan ETag objek dengan ETag yang disimpan dalam file checkpoint lokal dan mengembalikan hasil perbandingan.
*/
- (BOOL)getFileInfo {
__block BOOL resumable = NO;
NSURL *url = [NSURL URLWithString:self.headURLString];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
[request setHTTPMethod:@"HEAD"];
// Proses informasi tentang objek. Misalnya, ETag digunakan untuk pra-pemeriksaan selama unggah yang dapat dilanjutkan, dan header Content-Length digunakan untuk menghitung kemajuan unduhan.
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"Gagal mendapatkan metadata objek. error: %@", error);
} else {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSString *etag = [httpResponse.allHeaderFields objectForKey:@"Etag"];
if ([self.checkpoint.etag isEqualToString:etag]) {
resumable = YES;
} else {
resumable = NO;
}
}
dispatch_semaphore_signal(self.semaphore);
}];
[task resume];
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
return resumable;
}
/**
* Query ukuran file lokal.
*/
- (unsigned long long)fileSizeAtPath:(NSString *)filePath {
unsigned long long fileSize = 0;
NSFileManager *dfm = [NSFileManager defaultManager];
if ([dfm fileExistsAtPath:filePath]) {
NSError *error = nil;
NSDictionary *attributes = [dfm attributesOfItemAtPath:filePath error:&error];
if (!error && attributes) {
fileSize = attributes.fileSize;
} else if (error) {
NSLog(@"error: %@", error);
}
}
return fileSize;
}
- (void)resume {
NSURL *url = [NSURL URLWithString:self.requestURLString];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
[request setHTTPMethod:@"GET"];
BOOL resumable = [self getFileInfo]; // Jika nilai bidang resumable adalah NO, kondisi unduhan yang dapat dilanjutkan tidak terpenuhi.
if (resumable) {
self.totalReceivedContentLength = [self fileSizeAtPath:self.targetPath];
NSString *requestRange = [NSString stringWithFormat:@"bytes=%llu-", self.totalReceivedContentLength];
[request setValue:requestRange forHTTPHeaderField:@"Range"];
} else {
self.totalReceivedContentLength = 0;
}
if (self.totalReceivedContentLength == 0) {
[[NSFileManager defaultManager] createFileAtPath:self.targetPath contents:nil attributes:nil];
}
self.dataTask = [self.session dataTaskWithRequest:request];
[self.dataTask resume];
}
- (void)pause {
[self.dataTask cancel];
self.dataTask = nil;
}
- (void)cancel {
[self.dataTask cancel];
self.dataTask = nil;
[self removeFileAtPath: self.targetPath];
}
- (void)removeFileAtPath:(NSString *)filePath {
NSError *error = nil;
[[NSFileManager defaultManager] removeItemAtPath:self.targetPath error:&error];
if (error) {
NSLog(@"hapus file dengan kesalahan : %@", error);
}
}
#pragma mark - NSURLSessionDataDelegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
// Periksa apakah tugas unduhan selesai dan kembalikan hasilnya ke lapisan atas.
didCompleteWithError:(nullable NSError *)error {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response;
if ([httpResponse isKindOfClass:[NSHTTPURLResponse class]]) {
if (httpResponse.statusCode == 200) {
self.checkpoint.etag = [[httpResponse allHeaderFields] objectForKey:@"Etag"];
self.checkpoint.totalExpectedLength = httpResponse.expectedContentLength;
} else if (httpResponse.statusCode == 206) {
self.checkpoint.etag = [[httpResponse allHeaderFields] objectForKey:@"Etag"];
self.checkpoint.totalExpectedLength = self.totalReceivedContentLength + httpResponse.expectedContentLength;
}
}
if (error) {
if (self.failure) {
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:error.userInfo];
[userInfo oss_setObject:self.checkpoint forKey:@"checkpoint"];
NSError *tError = [NSError errorWithDomain:error.domain code:error.code userInfo:userInfo];
self.failure(tError);
}
} else if (self.success) {
self.success(@{@"status": @"success"});
}
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)dataTask.response;
if ([httpResponse isKindOfClass:[NSHTTPURLResponse class]]) {
if (httpResponse.statusCode == 200) {
self.checkpoint.totalExpectedLength = httpResponse.expectedContentLength;
} else if (httpResponse.statusCode == 206) {
self.checkpoint.totalExpectedLength = self.totalReceivedContentLength + httpResponse.expectedContentLength;
}
}
completionHandler(NSURLSessionResponseAllow);
}
// Tulis data jaringan yang diterima ke objek menggunakan unggah tambahan dan perbarui kemajuan unduhan.
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:self.targetPath];
[fileHandle seekToEndOfFile];
[fileHandle writeData:data];
[fileHandle closeFile];
self.totalReceivedContentLength += data.length;
if (self.progress) {
self.progress(data.length, self.totalReceivedContentLength, self.checkpoint.totalExpectedLength);
}
}
@end#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi tentang akun yang digunakan untuk mengakses OSS. */
/* Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan jalur penuh objek. Jangan sertakan nama bucket dalam jalur penuh. Contoh: exampledir/exampleobject.txt. */
std::string ObjectName = "exampledir/exampleobject.txt";
/* Unduh objek ke jalur lokal D:\\localpath sebagai file lokal bernama examplefile.txt. Jika file dengan nama yang sama sudah ada di jalur yang ditentukan, objek yang diunduh akan menimpa file tersebut. Jika tidak, objek yang diunduh disimpan di jalur tersebut. */
/* Jika Anda tidak menentukan jalur file lokal, objek yang diunduh disimpan ke jalur proyek tempat program contoh milik. */
std::string DownloadFilePath = "D:\\localpath\\examplefile.txt";
/* Tentukan direktori tempat file checkpoint disimpan dan pastikan direktori yang ditentukan ada, seperti D:\\localpath. */
/* File checkpoint dibuat saat unduhan terganggu. Jika Anda ingin melanjutkan tugas unduhan, Anda harus menentukan jalur penuh file checkpoint. Setelah objek diunduh, file checkpoint dihapus. */
std::string CheckpointFilePath = "D:\\localpath";
/* Inisialisasi sumber daya seperti sumber daya jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Mulai unduhan yang dapat dilanjutkan. */
DownloadObjectRequest request(BucketName, ObjectName, DownloadFilePath, CheckpointFilePath);
auto outcome = client.ResumableDownloadObject(request);
if (!outcome.isSuccess()) {
/* Tangani pengecualian. */
std::cout << "ResumableDownloadObject gagal" <<
",kode:" << outcome.error().Code() <<
",pesan:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya seperti sumber daya jaringan. */
ShutdownSdk();
return 0;
}#include "oss_api.h"
#include "aos_http_io.h"
/* Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Contoh: examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan jalur penuh objek. Jangan sertakan nama bucket dalam jalur penuh. Contoh: exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan jalur penuh file lokal. */
const char *local_filename = "yourLocalFilename";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Gunakan string char* untuk menginisialisasi aos_string_t. */
aos_str_set(&options->config->endpoint, endpoint);
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// Tentukan dua parameter tambahan.
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* Tentukan apakah menggunakan CNAME. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Tentukan parameter jaringan, seperti periode timeout. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Panggil metode aos_http_io_initialize di main() untuk menginisialisasi sumber daya global, seperti sumber daya jaringan dan memori. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* Buat kumpulan memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode yang digunakan untuk membuat kumpulan memori disertakan dalam pustaka APR. */
aos_pool_t *pool;
/* Buat kumpulan memori. Nilai parameter kedua adalah NULL. Nilai ini menentukan bahwa kumpulan tidak mewarisi kumpulan memori lainnya. */
aos_pool_create(&pool, NULL);
/* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
oss_request_options_t *oss_client_options;
/* Alokasikan sumber daya memori di kumpulan memori untuk opsi. */
oss_client_options = oss_request_options_create(pool);
/* Inisialisasi oss_client_options. */
init_options(oss_client_options);
/* Inisialisasi parameter. */
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
oss_resumable_clt_params_t *clt_params;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
/* Lakukan unduhan yang dapat dilanjutkan untuk mengunduh objek. */
clt_params = oss_create_resumable_clt_params_content(pool, 1024 * 100, 3, AOS_TRUE, NULL);
resp_status = oss_resumable_download_file(oss_client_options, &bucket, &object, &file, headers, NULL, clt_params, NULL, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("unduhan berhasil\n");
} else {
printf("unduhan gagal\n");
}
/* Lepaskan kumpulan memori. Operasi ini melepaskan sumber daya memori yang dialokasikan untuk permintaan. */
aos_pool_destroy(pool);
/* Lepaskan sumber daya global yang dialokasikan. */
aos_http_io_deinitialize();
return 0;
}require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Dalam contoh ini, endpoint wilayah China (Hangzhou) digunakan. Tentukan endpoint aktual Anda.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Tentukan nama bucket. Contoh: examplebucket.
bucket = client.get_bucket('examplebucket')
# Set key ke jalur penuh objek. Jangan sertakan nama bucket dalam jalur penuh. Contoh: exampledir/example.zip.
# Set file ke jalur penuh file lokal. Contoh: /tmp/example.zip.
bucket.resumable_download('exampledir/example.zip', '/tmp/example.zip') do |p|
puts "Kemajuan: #{p}"
end
bucket.resumable_download(
'exampledir/example.zip', '/tmp/example.zip',
# Set cpt_file ke jalur file checkpoint.
:part_size => 100 * 1024, :cpt_file => '/tmp/example.zip.cpt') { |p|
puts "Kemajuan: #{p}"
}Referensi
Untuk informasi lebih lanjut tentang cara mengunduh objek dari bucket dengan versioning diaktifkan, lihat Kelola objek dalam bucket dengan versioning diaktifkan.
Jika Anda ingin memberikan izin kepada pengguna pihak ketiga untuk mengunduh objek dari bucket privat, gunakan STS untuk menghasilkan kredensial akses sementara atau gunakan URL yang ditandatangani. Untuk informasi lebih lanjut, lihat Izinkan pengguna pihak ketiga untuk mengunduh objek.