【问题标题】:AWSS3GetObjectRequest.ifModifiedSince does not seem to be workingAWSS3GetObjectRequest.ifModifiedSince 似乎没有工作
【发布时间】:2017-08-26 04:51:29
【问题描述】:

我无法让 ifModifiedSince 工作。这是我的代码:

func updateDatabase()
{
    let objectRequest = AWSS3GetObjectRequest()
    objectRequest?.key = "wa/wa2016/idahoGmu.tiff"
    objectRequest?.bucket = bucketName

    let dateComponents = NSDateComponents()
    dateComponents.day = 10
    dateComponents.month = 4
    dateComponents.year = 2018
    let date = NSCalendar.current.date(from: dateComponents as DateComponents)

    // TODO This isn't working.  It grabs the file regardless of date.
    objectRequest?.ifModifiedSince = date

    let s3 = AWSS3.default()

    s3.getObject(objectRequest!).continueWith
    {
        (task) -> AnyObject! in if let error = task.error
        {
            print("Error: \(error.localizedDescription)")
        }

        if let result = task.result
        {
            let fileManager = FileManager.default
            let documents = Bundle.main.resourcePath
            let writePath = documents?.appending("/Content/idahoGmu.tiff")
            let output = result as AWSS3GetObjectOutput

            let fileData = output.body as! Data
            fileManager.createFile(atPath: writePath!, contents: fileData, attributes: nil)
        }

        return nil;
    }
}

格式化日期有什么问题吗?我读了这个关于日期格式的问题(但现在报告为已修复): AWSS3GetObjectRequest ifModifiedSince not working

当我打印出日期时,它看起来像这样:

2018-04-10 07:00:00 +0000

【问题讨论】:

  • 下载一个对象并查看Last-Modified 标头。那是你的格式。
  • 好的,这是我下载的对象:
  • contentLength = 435278; contentType = "图像/tiff"; lastModified = "2017-03-14 19:46:29 +0000";但是我传入的 ifModifiedSince 字段是一个日期对象(参见上面的 dateComponents 变量)。由于它是一个对象,因此日期并没有我可以控制的格式。我错过了什么?
  • A little more info ... 这是请求中的 ifModifiedSince 日期:"If-Modified-Since" = "Fri, 10 Apr 2020 07:00:00 GMT" 这是返回的对象中的 lastModified:lastModified = "2017-03-14 19:46:29 +0000" 如何控制请求(因为它是一个对象,而不是一个字符串)?
  • @Yosuke Matsuda 您对此有何见解?

标签: ios swift amazon-web-services amazon-s3 aws-sdk


【解决方案1】:

也许你可以把ifModifiedSince替换成AWSS3HeadObjectRequest(),例如:

// create a date to compare
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd"
let checkDate = formatter.date(from: "2016/10/08")

// make a request to AWS S3, to get a info of file
let request = AWSS3HeadObjectRequest()!
request.bucket = bucket
request.key = key
AWSS3.default().headObject(request).continue({
    task -> Any? in

    if let result = task.result,
      ((result as AWSS3HeadObjectOutput) != nil) {

        let servDate = result.lastModified!
        if checkDate < servDate {
            // my file was modified after 2016/10/08
        } else {
            // my file was NOT modified after 2016/10/08
        }
    }
 }

You can see a example where.我使用类似的东西来创建一个缓存系统,在checkDownloadCache(bucket:key)函数中。

【讨论】:

  • 是的,这就是我所采用的方法——我自己比较日期。但我仍然想知道为什么 ifModifiedSince 不能处理 AWSS3GetObjectRequest。我确实尝试使用 DateFormatter 格式化日期,所以它看起来像“2018-04-10 07:00:00 +0000”,以匹配从 AWS 返回的格式。但无论日期如何,getObject 仍会获取对象。谢谢你的例子。
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
相关资源
最近更新 更多