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

塞巴斯蒂安

我创建了一个从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文件。我下载并将其复制到documents文件夹,然后dictionaryWithContentsOfFile可以打开文件。所以我想当我使用AFAmazonS3Client下载文件时plist文件已损坏

我做错了什么?

更新1

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

塞巴斯蒂安

由于某种原因,getObjectWithPathfrom的AFAmazonS3Manager方法无法正常工作。

所以我AFHTTPRequestOperation直接使用AFNetworking重写了我的方法

- (void)downloadFile:(NSString *)fileName block:(void (^)(NSError *error))block {

    NSString *urlString = @"https://[bucket].[server area].amazonaws.com/";
    urlString = [urlString stringByAppendingPathComponent:fileName];

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    NSSet *set = operation.responseSerializer.acceptableContentTypes;

    if ([[fileName pathExtension] isEqualToString:@"m4a"]) {
        NSLog(@"%@ set as audio/mp4", fileName);
        operation.responseSerializer.acceptableContentTypes = [set setByAddingObject:@"audio/mp4"];
    } else if ([[fileName pathExtension] isEqualToString:@"png"]) {
        NSLog(@"%@ set as image/png", fileName);
        operation.responseSerializer.acceptableContentTypes = [set setByAddingObject:@"image/png"];
    } else if ([[fileName pathExtension] isEqualToString:@"plist"]) {
        NSLog(@"%@ set as application/x-plist", fileName);
        operation.responseSerializer.acceptableContentTypes = [set setByAddingObject:@"application/x-plist"];
    }

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

    NSString *fullPath = [documentsPath stringByAppendingPathComponent:[url lastPathComponent]];

    [operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:fullPath append:NO]];

    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
        NSLog(@"bytesRead: %lu, totalBytesRead: %lld, totalBytesExpectedToRead: %lld", (unsigned long)bytesRead, totalBytesRead, totalBytesExpectedToRead);
    }];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        if (block) {
            block(nil);
        }

        NSLog(@"RES: %@", [[[operation response] allHeaderFields] description]);

        NSError *error;
        NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:fullPath error:&error];

        if (error) {
            NSLog(@"ERR: %@", [error description]);
        } else {
            NSNumber *fileSizeNumber = [fileAttributes objectForKey:NSFileSize];
            long long fileSize = [fileSizeNumber longLongValue];

            NSLog(@"%lld", fileSize);
        }


    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (block) {
            block(error);
        }
        NSLog(@"ERR: %@", [error description]);
    }];

    [operation start];
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

从S3下载时Excel文件损坏

来自分类Dev

从带有文件系统的AWS S3下载的Laravel文件已损坏

来自分类Dev

通过php从s3下载大文件

来自分类Dev

从AWS S3下载清单文件

来自分类Dev

迭代从S3下载的JSON文件

来自分类Dev

流星S3下载

来自分类Dev

AsyncTask管理从Amazon S3下载的图片

来自分类Dev

Amazon S3下载需要密钥

来自分类Dev

在Android应用程序中从Amazon s3下载之前获取文件的大小

来自分类Dev

使用bash从S3下载私有文件

来自分类Dev

如何使用传输实用程序从s3下载特定版本的文件

来自分类Dev

直接从AWS S3下载时更改用户的文件名

来自分类Dev

如何将从S3下载的文件对象存储到本地目录

来自分类Dev

在更新文件时从AWS S3下载

来自分类Dev

如何加快从AWS S3下载数百万个文件的速度

来自分类Dev

如何将从S3下载的文件对象存储到本地目录

来自分类Dev

AWS S3下载链接问题

来自分类Dev

如何使用Java中的URL从Amazon S3下载对象

来自分类Dev

是否可以不通过boto3下载而获取S3文件的内容?

来自分类Dev

将tar.gz文件从S3下载/复制到EC2

来自分类Dev

WinHttp不在WinXP上从Amazon S3下载

来自分类Dev

crontab中的Amazon s3下载无法正常工作吗?

来自分类Dev

获得预签名的Amazon S3下载URL的最佳实践

来自分类Dev

使用Laravel从Amazon S3下载文件

来自分类Dev

使用预先签名的URL从S3下载对象

来自分类Dev

如何以numpy数组的形式从s3下载图像?

来自分类Dev

AWS EC2高Ping和S3下载慢

来自分类Dev

创建带有签名算法版本4的单一S3下载链接