Sky*_*ker 5 objective-c amazon-s3 amazon-web-services ios
我正在开发一个依赖于 AWS 进行文件上传和下载的应用程序。在上传的情况下,当我使用 AWSS3TransferManagerUploadRequest 上传视频文件时,我可以使用进度块显示进度条,但是当我按下主页按钮并且应用程序进入后台时,上传会暂停(可能是因为它使用 NSURLConnection)。仅当应用程序在前台运行时才会进行上传。
这是使用 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;
}];
Run Code Online (Sandbox Code Playgroud)
除了后台传输之外,此方法有效。
因此,我继续使用 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;
}];
Run Code Online (Sandbox Code Playgroud)
这样就解决了后台上传的问题。但它没有进度块,因此我无法跟踪进度。
我必须能够跟踪进度并从后台上传。这可能吗?或者有什么解决方法吗?
因此,我做了很多挖掘并找到了这个问题的答案。这可能对某人有帮助。
AWSS3TransferManager 有进度块来跟踪进度,但不支持后台传输。AWSS3GetPreSignedURLRequest 支持后台传输,但无法跟踪进度。
他们还有另一项服务,您可以通过该服务在后台跟踪进度并上传/下载。使用 AWSS3TransferUtility,您可以完成这两件事。请注意,这仍处于测试阶段。
请参阅文档以获取更多信息 - http://docs.aws.amazon.com/mobile/sdkforios/developerguide/s3transferutility.html
我在这方面遇到了很多麻烦(部分原因是我的无知)。我希望这对有类似问题的人有用。
| 归档时间: |
|
| 查看次数: |
5684 次 |
| 最近记录: |