ios - AWSS3GetObjectRequest ifModifiedSince 不起作用

标签 ios iphone amazon-web-services amazon-s3

针对 iOS 7+ 构建基于 Xcode 6.1 构建, 使用 Amazon SDK AWSiOSSDKv2 2.0.12 、 iPhone 5s 和 iPad 2 上进行测试

我正在使用适用于 iOS 的 Amazon SDK 从我的 Amazon S3 存储桶下载图像。 下载工作正常,但我想使用 ifModifiedSince 属性来仅检索自特定日期以来已修改的图像 (参见http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSS3GetObjectRequest.html#//api/name/ifModifiedSince)

但是,这不起作用。即使我指定的 ifModifiedSince 日期晚于 S3 上文件的修改日期,也会返回该文件。

根据亚马逊文档: ifModifiedSince -

Return the object only if it has been modified since the specified time, otherwise return a 304 (not modified).

所以我不确定是我做错了什么还是亚马逊的 SDK 中有错误。

这是我的代码:

-(void)downloadPhotoWithName:(NSString*)name completed:(retrievedImage)completed {



NSFileManager *manager = [NSFileManager defaultManager];
NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cacheDirectory = [cachePaths firstObject];
NSString *filename = [NSString stringWithFormat:@"%@.jpg", name];
NSString *filePath = [cacheDirectory stringByAppendingPathComponent:filename];


AWSS3 *transferManager = [AWSS3 defaultS3];
AWSS3GetObjectRequest *profilePhoto = [[AWSS3GetObjectRequest alloc] init];
profilePhoto.bucket = S3BUCKETNAMEIMAGE;
profilePhoto.key = filename;



if ([manager fileExistsAtPath:filePath isDirectory:NULL]) {

    NSDictionary *att = [manager attributesOfItemAtPath:filePath error:nil];

    if (att) {

        //Get the date of when the file was modified so we can request to retrieve 
        //the file only if it was modified SINCE that date

        NSDate *modifiedDate = [att objectForKey:NSFileModificationDate];

        if (modifiedDate) {
            profilePhoto.ifModifiedSince = modifiedDate;
        }

    }


}


[[transferManager getObject:profilePhoto] continueWithBlock:^id(BFTask *task) {


    //If it was working we should get a 304 not the image file
    if (task.result) {


        AWSS3GetObjectOutput *output = (AWSS3GetObjectOutput*)task.result;
        NSData *imageData = (NSData*)output.body;


        if (imageData) {


            NSDictionary* attr = [NSDictionary dictionaryWithObjectsAndKeys:output.lastModified, NSFileModificationDate, NULL];

            //The log confirms that the date I am passing for ifModifiedSince is LATER THAN
            //the last modified date of the file on S3
            //but the the image file is returned anyway.. is it a problem with Amazon ?

            NSLog(@"output.lastModified: %@\nmodifiedDate: %@", output.lastModified, profilePhoto.ifModifiedSince);

            if  ([manager createFileAtPath:filePath contents:imageData attributes:attr]) {

                 completed(imageData);

            }
            else {

                NSLog(@"Could not save image to disk for some reason");
                completed(nil);

            }



        }
        else {



            completed(nil);
        }



    }
    else if (task.error) {
       NSLog(@"DownloadPhotoError: %@", task.error);

       completed(nil);
    }



    return nil;
}];

}

最佳答案

我们发布了适用于 iOS 2.0.14 的 AWS 移动开发工具包。它应该解决时间格式问题。

关于ios - AWSS3GetObjectRequest ifModifiedSince 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27190654/

相关文章:

objective-c - iOS RPNCalculatorStanfordVidOne 无法弄清楚为什么除了一根线之外的所有线都在工作

ios - iAD 未按预期工作

amazon-web-services - 使用 AWS glue 合并多个 Parquet 文件并在 s3 中创建更大的 Parquet 文件

ios - CocoaPods - 无法找到规范

ios - 使用 CustomCell 文件提取文本字段值

iPhone - 与多个 UIGestureRecognizer 冲突

iphone - 在 iPhone 应用程序中创建下拉列表

amazon-web-services - 将 ASP.NET Core 部署到 AWS Elastic Beanstalk,必须包含一个带有 '.runtimeconfig.json' 后缀错误的文件

amazon-web-services - 使用 spark 从胶水目录中读取而不是使用动态框架(胶水上下文)

ios - 在不运行按钮代码的情况下转到 SecondViewController