Kablosuz bir ağ üzerinden büyük dosyalar yüklemek uzun zaman alabilir. Kötü ağ koşulları veya ağ değişiklikleri yüklemenin başarısız olmasına neden olabilir. Bir yükleme başarısız olursa tüm dosyanın yeniden yüklenmesi gerekir. Bu sorunu çözmek için iOS yazılım geliştirme kiti (SDK), kalan yerden yükleme özelliği sunar.
Arka plan bilgileri
Bir mobil cihazdan 5 GB'tan küçük nesneleri yüklerken kalan yerden yükleme kullanmanızı önermiyoruz. Kalan yerden yükleme, çok parçalı yükleme özelliği kullanılarak uygulanır. Tek bir nesnenin bu yöntemle yüklenmesi birden fazla ağ isteği gerektirir; bu da verimsizdir. 5 GB'tan büyük bir nesneyi kalan yerden yükleme yöntemiyle yüklerken aşağıdaki hususlara dikkat edin:
-
Kalan yerden yüklemeden önce
Bir nesneyi OSS'ye kalan yerden yükleme yöntemiyle yüklemeden önce, yükleme ilerlemesini depolayan kontrol noktası dosyası için bir dizin belirtebilirsiniz. Kontrol noktası dosyası yalnızca geçerli kalan yerden yükleme görevine uygulanır.
Kontrol noktası dosyası için bir dizin belirtmezseniz ve ağ sorunları nedeniyle büyük bir nesnenin bir parçası yüklenemezse tüm nesneyi yeniden yüklemek uzun zaman alır ve yüksek miktarda trafik tüketilir.
Kontrol noktası dosyası için bir dizin belirtirseniz başarısız olan bir kalan yerden yükleme görevi, kontrol noktası dosyasında kaydedilen konumdan devam ettirilebilir.
-
Kalan yerden yükleme sırasında
Kalan yerden yükleme ile yalnızca yerel dosyaları yükleyebilirsiniz. Kalan yerden yükleme, geri arama özelliğini destekler; bu özellik normal yükleme görevleriyle aynı şekilde kullanılır. Daha fazla bilgi için bkz. Geri arama.
Aşağıdaki API işlemlerini çağırarak kalan yerden yükleme yapabilirsiniz: InitMultipartUpload, UploadPart, ListParts, CompleteMultipartUpload ve AbortMultipartUpload. Security Token Service (STS) kullanarak kalan yerden yükleme yapmak istiyorsanız söz konusu API işlemlerini çağırma yetkisine sahip olduğunuzdan emin olun.
Varsayılan olarak kalan yerden yükleme sırasında her parça için MD5 doğrulaması etkindir. Bu nedenle istekte
Content-Md5üst bilgisini ayarlamanız gerekmez.-
Bir görev uzun süre devam ettirilemezse OSS'de tamamlanmamış çok parçalı yüklemeler birikebilir. Bu parçaları periyodik olarak silmek için paket üzerinde yaşam döngüsü kuralları ayarlayabilirsiniz. Daha fazla bilgi için bkz. Yaşam döngüsü yönetimi.
ÖnemliBir kalan yerden yükleme görevini iptal ederseniz sunucuya zaten yüklenen parçalar varsayılan olarak silinir. Bir görevi iptal ederken kırılma noktası kayıtlarını korumak için kayıtlar için bir klasör belirtmeniz ve deleteUploadIdOnCancelling parametresini değiştirmeniz gerekir. Sunucu kayıtları uzun süre saklarsa ve bir yaşam döngüsü kuralı parçaları sunucudan silerse sunucudaki ve mobil istemcideki kayıtlar tutarsız hale gelebilir.
Notlar
-
Bu konudaki örnekleri kullanmadan önce özel bir etki alanı adı veya Security Token Service (STS) kullanarak bir OSSClient oluşturmanız gerekir. Daha fazla bilgi için bkz. Başlatma (iOS SDK).
NotPaketin bölgesi, başlatma yapılandırmasında belirtilen uç nokta tarafından belirlenir.
Bir dosya yüklemek için
oss:PutObjectiznine sahip olmalısınız. Daha fazla bilgi için bkz. RAM kullanıcısına özel erişim ilkeleri atama.
Örnek kod
-
Kırılma noktası kayıtlarını yerel olarak kaydetmek için kalan yerden yüklemeyi aşağıdaki gibi gerçekleştirmek üzere
resumableUploadyöntemini çağırabilirsiniz:OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = OSS_BUCKET_PRIVATE; //... NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; resumableUpload.recordDirectoryPath = cachesDir;NotKalan yerden bir yükleme başarısız olursa bir kırılma noktası kayıt dosyası oluşturulur. Yükleme daha sonra tamamlanana kadar kırılma noktasından devam eder. Yükleme başarılı olduktan sonra kırılma noktası kayıt dosyası otomatik olarak silinir. Varsayılan olarak kırılma noktası kayıtları yerel olarak kaydedilmez.
-
Aşağıdaki kod, kalan yerden bir yükleme için eksiksiz bir örnek sağlar:
// Obtain the UploadId to upload the file. OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = <bucketName>; // objectKey is the same as objectName. It specifies the full path of the object that you want to upload to OSS, including the file extension. For example, abc/efg/123.jpg. resumableUpload.objectKey = <objectKey>; resumableUpload.partSize = 1024 * 1024; resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend); }; NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; // Set the path to save the breakpoint record. resumableUpload.recordDirectoryPath = cachesDir; // Set the deleteUploadIdOnCancelling parameter to NO. This indicates that the breakpoint record file is not deleted. If the upload fails, the upload resumes from the breakpoint until the file is completely uploaded. If you do not set this parameter, the default value YES is used. This indicates that the breakpoint record file is deleted. The next time you upload the same file, the upload starts from the beginning. resumableUpload.deleteUploadIdOnCancelling = NO; resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>]; OSSTask * resumeTask = [client resumableUpload:resumableUpload]; [resumeTask continueWithBlock:^id(OSSTask *task) { if (task.error) { NSLog(@"error: %@", task.error); if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) { // This task cannot be resumed. You must obtain a new uploadId to re-upload the file. } } else { NSLog(@"Upload file success"); } return nil; }]; // [resumeTask waitUntilFinished]; // [resumableUpload cancel];