我正在研究一個依靠AWS進行文件上傳和下載的應用程序。在上傳的情況下,當我使用AWSS3TransferManagerUploadRequest上傳視頻文件時,我可以使用進度塊顯示進度條,但是當我按Home按鈕並且應用程序進入後臺時,上傳暫停(可能是因爲它使用NSURLConnection)。只有當應用程序在前臺運行時纔會上載。Amazon S3 iOS SDK使用進度塊上傳背景
這是使用AWSS3TransferManagerUploadRequest上傳文件的代碼。
AWSS3TransferManager *transferManager = [AWSS3TransferManager defaultS3TransferManager];
AWSS3TransferManagerUploadRequest *uploadRequest = [AWSS3TransferManagerUploadRequest new];
uploadRequest.bucket = bucketName;
uploadRequest.key = appropriateKey;
uploadRequest.body = [NSURL fileURLWithPath:filePath];
uploadRequest.contentType = contentType;
uploadRequest.uploadProgress = progressBlock;
[[transferManager upload:uploadRequest] continueWithExecutor:[AWSExecutor mainThreadExecutor] withBlock:^id(AWSTask *task) {
if (task.error)
{
if ([task.error.domain isEqualToString:AWSS3TransferManagerErrorDomain])
{
switch (task.error.code)
{
case AWSS3TransferManagerErrorCancelled:
case AWSS3TransferManagerErrorPaused:
break;
default:
failBlock(task.error.code, task.error.localizedDescription);
break;
}
}
else
{
failBlock(task.error.code, task.error.localizedDescription);
}
}
if (task.result)
{
AWSS3TransferManagerUploadOutput *uploadOutput = task.result;
successBlock(uploadOutput);
}
return nil;
}];
這是有效的,除了在後臺傳輸。
因此,我繼續使用AWS的預先簽名的URL。以下是相同的代碼。
AWSS3GetPreSignedURLRequest *getPreSignedURLRequest = [AWSS3GetPreSignedURLRequest new];
getPreSignedURLRequest.bucket = bucketName;
getPreSignedURLRequest.key = appropriateKey;
getPreSignedURLRequest.HTTPMethod = AWSHTTPMethodPUT;
getPreSignedURLRequest.expires = [NSDate dateWithTimeIntervalSinceNow:3600];
//Important: set contentType for a PUT request.
NSString *fileContentTypeStr = contentType;
getPreSignedURLRequest.contentType = fileContentTypeStr;
[[[AWSS3PreSignedURLBuilder defaultS3PreSignedURLBuilder] getPreSignedURL:getPreSignedURLRequest]
continueWithBlock:^id(AWSTask *task) {
if (task.error) {
NSLog(@"Error: %@",task.error);
} else {
NSURL *presignedURL = task.result;
NSLog(@"upload presignedURL is: \n%@", presignedURL);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:presignedURL];
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[request setHTTPMethod:@"PUT"];
[request setValue:fileContentTypeStr forHTTPHeaderField:@"Content-Type"];
NSURLSession *session;
NSURL *uploadFileUrl = [NSURL fileURLWithPath:filePath];
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:uploadFileUrl];
//uploadTask is an instance of NSURLSessionDownloadTask.
//session is an instance of NSURLSession.
[uploadTask resume];
}
return nil;
}];
這解決了在後臺上傳的問題。但它沒有進展模塊,因此我無法追蹤進展。
我必須能夠跟蹤進度並從後臺上傳。這可能嗎?或者有任何解決方法?
您是否找到過預先簽名,上傳和跟蹤進度的方法? – Eusthace
@Eusthace檢查我的答案..我做到了。他們提供TransferUtility。它仍處於測試階段,但按要求工作。 – Skywalker