使用AFAmazonS3Client从Amazon S3下载的文件损坏

时间:2014-10-24 13:11:24

标签: objective-c amazon-s3 plist afnetworking-2

我创建了一个从Amazon S3下载plist文件的应用程序。我在AFAmazonS3Client框架中使用AFNetworking客户端。

-(void) getFile:(NSString *)fileName{
    self.s3Manager = [[AFAmazonS3Manager alloc] initWithAccessKeyID:@"..." secret:@"..."];
    self.s3Manager.requestSerializer.region = AFAmazonS3SAEast1Region;
    self.s3Manager.requestSerializer.bucket = @"verba";

    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    documentsPath = [documentsPath stringByAppendingPathComponent:fileName];

    NSOutputStream *stream = [[NSOutputStream alloc] initToFileAtPath:documentsPath append:NO];

    [self.s3Manager getObjectWithPath:@""
                         outputStream:stream
                             progress:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
         NSLog(@"%f%% Downloaded", (totalBytesRead / (totalBytesExpectedToRead * 1.0f) * 100));
    } success:^(id responseObject) {
         NSLog(@"Download Complete");
    } failure:^(NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

然后我检查了plist文件是否在文件夹中。它就是。所以我试图打开plist文件,结果是nil:

-(NSString*) loadListName:(NSString*)fileName{
    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* filePath = [documentsPath stringByAppendingPathComponent:fileName];

    NSDictionary *temp;
    if ([[NSFileManager defaultManager] fileExistsAtPath: filePath]){
        temp = [NSDictionary dictionaryWithContentsOfFile:filePath];
    } else {
        NSLog(@"File not found.");
    }

    NSString *listName = [temp objectForKey:@"name"];

    return listName;
}

所以我尝试手动添加plist文件。我下载并将其复制到文档文件夹,然后dictionaryWithContentsOfFile可以打开该文件。因此,当我使用AFAmazonS3Client下载文件时,我认为plist文件已损坏。

我做错了什么?

更新1

我意识到我从S3下载的每个文件都已损坏。我不知道我是以正确的方式处理NSOutputStream还是其他东西。

2 个答案:

答案 0 :(得分:2)

由于某些原因,来自getObjectWithPath的{​​{1}}方法无效。

所以我直接从AFNetworking

使用AFAmazonS3Manager重写我的方法
AFHTTPRequestOperation

答案 1 :(得分:-1)

在Xcode的最后一个版本中要小心,每次在模拟器中重启你的应用程序时,文件夹都会被删除