如何将S3中的文件下载到iPhone应用程序?

4

我刚接触iPhone开发。我正在开发一个需要打开Amazon S3服务中存储的文件的iPhone应用程序。

如何将S3上的文件下载到我的iPhone应用程序中?我尝试了Amazon的SDK,但它们似乎没有提供下载和保存文件的方法。我应该如何获取S3文件的URL并在我的应用程序中保存它?


1
我会使用AWS SDK for iOS - S3本质上是复杂的 - 代码示例应该会有所帮助 - https://github.com/amazonwebservices/aws-sdk-for-ios/tree/master/samples/awsBrowser - petert
我只尝试了那个代码……他们提供了关于文件的详细信息示例,但没有提供下载或打开文件的示例。 - itdeeps
快速在论坛上搜索显示有关文件下载问题的帖子,因此可能是- https://forums.aws.amazon.com/thread.jspa?threadID=69971&tstart=0 - petert
他们正在独自处理上传问题 :( 连下载都没有提过一句:( - itdeeps
2个回答

3
我通常使用ASIHttpRequest库来完成这个任务,它非常简单,以下是来自他们网站的示例代码:
NSString *secretAccessKey = @"my-secret-access-key";
NSString *accessKey = @"my-access-key";
NSString *bucket = @"my-bucket";
NSString *path = @"path/to/the/object";

ASIS3ObjectRequest *request = [ASIS3ObjectRequest requestWithBucket:bucket key:path];
[request setSecretAccessKey:secretAccessKey];
[request setAccessKey:accessKey];
[request startSynchronous];
if (![request error]) {
  NSData *data = [request responseData];
} else {
  NSLog(@"%@",[[request error] localizedDescription]);
}

您不能比这更简单了 :)

好的,我会尝试并告诉您结果... 在此期间,如何打开已下载的文件?例如,如何使用查看器打开已下载的PDF文件? - itdeeps
@iteeps-查看PDF文件是一个单独的问题。我编辑了你的原始内容,以便将其集中在从S3下载文件的问题上。如果您在这里进行搜索,您会发现许多关于如何在UIWebView或使用Quartz中查看PDF文件的示例。 - Brad Larson
@Mauricio - 我在这里遇到了错误...实际上,我已经尝试过一个单独的项目,然后在他们的演示项目中创建了一个视图控制器,但是两者都出现了错误 :( 我得到的错误是:"OBJC_CLASS$_ASIS3ObjectRequest",引用自: objc-class-ref-to-ASIS3ObjectRequest in objectDownloadController.o 有什么想法吗??? - itdeeps
@Maurício Linhares,我遇到了“指定的键不存在”的错误,请告诉我问题出在哪里? - Nikunj Jadav

3

如果你没有使用ASI的简单便利,或者你被困在AWSiOS SDK中,那么这并没有太大区别:

/* borrowed from Maurício Linhares's answer */
NSString *secretAccessKey = @"my-secret-access-key";
NSString *accessKey = @"my-access-key";
NSString *bucket = @"my-bucket";
NSString *path = @"path/to/the/object";
/********************************************/

AmazonCredentials *credentials = [[AmazonCredentials alloc] initWithAccessKey: accessKey withSecretKey: secretAccessKey];
AmazonS3Client *connection = [[AmazonS3Client alloc] initWithCredentials: credentials];

S3GetObjectRequest *downloadRequest = [[[S3GetObjectRequest alloc] initWithKey:path withBucket: bucket] autorelease];
[downloadRequest setDelegate: self]; /* only needed for delegate (see below) */
S3GetObjectResponse *downloadResponse = [self.awsConnection getObject: downloadRequest];

然后您可以查看downloadResponse.bodydownloadResponse.httpStatusCode,最好在委托中进行:

-(void)request: (S3Request *)request didCompleteWithResponse: (S3Response *) response {
    NSLog(@"Download finished (%d)",response.httpStatusCode);
    /* do something with response.body and response.httpStatusCode */
    /* if you have multiple requests, you can check request arg */
}   

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接