2016-08-06 10 views
0

私はS3からファイルをダウンロードする機能を持っています。動作しますが、IfModifiedSinceオプションは認識されません。以下の関数は同じ名前のファイルをローカルに探し、存在する場合はtime.TimeオブジェクトをModificationの日付と時刻に設定します。それはその後、それが変更された場合にのみファイルをダウンロードするためにS3へのリクエストで使用されます。AWS S3のIf-Modified-SinceヘッダをGoを使用して設定する方法

func DownloadS3Media(filename string, mediaDirectory string, bucket string, c *configuration.Configuration) (dest string, bytes int64, err error) { 
    os.Setenv("AWS_ACCESS_KEY_ID", c.AWS_ACCESS_KEY_ID) 
    os.Setenv("AWS_SECRET_ACCESS_KEY", c.AWS_SECRET_ACCESS_KEY) 

    // Create the directories in the path 
    finalFilePath := filepath.Join(mediaDirectory, filename) 
    if err1 := os.MkdirAll(filepath.Dir(finalFilePath), 0775); err1 != nil { 
     return "", 0, err1 
    } 

    //Create the blank file to push the data into 
    var t *time.Time 
    if fi, err2 := os.Stat(finalFilePath); err2 == nil { 
     t1 := fi.ModTime() 
     t = &t1 
    } 
    tempFilePath := filepath.Join(mediaDirectory, filename + ".tmp") 
    tempFile, err3 := os.Create(tempFilePath) 
    if err3 != nil { 
     log.Println("Failed to create file", err3) 
     return finalFilePath, 0, err3 
    } 
    defer tempFile.Close() 

    logLevel := aws.LogDebug 
    downloader := s3manager.NewDownloader(session.New(&aws.Config{Region: aws.String("us-east-1"), LogLevel:&logLevel})) 
    params := &s3.GetObjectInput{Bucket: aws.String(bucket), 
     Key: aws.String(filename), 
     IfModifiedSince: t} 
    numBytes, err4 := downloader.Download(tempFile, params) 
    if err4 != nil { 
     log.Println("Failed to download file", err4) 
     return finalFilePath, 0, err4 
    } 

    //if downloader pulled down the file, rename the tmp file to original. 
    if _, err5 := os.Stat(tempFilePath); err5 == nil { 
     os.Rename(tempFilePath, finalFilePath) 
     log.Println("Renamed ", tempFilePath, "to", finalFilePath) 
    } 

    log.Println("Downloaded file", filename, "to", finalFilePath, numBytes, "bytes") 
    return finalFilePath, numBytes, nil 
} 

デバッグするとき、私はsec: 63606119179のようなものである&トンのために適切な値を参照してください。 AWSが要求を送信するまでに、ヘッダーは存在しますが、1/1/0001に設定されています。

---[ REQUEST POST-SIGN ]----------------------------- 
GET http://*****.s3.amazonaws.com/domenic-test.png HTTP/1.1 
Host: *****.s3.amazonaws.com 
User-Agent: aws-sdk-go/1.3.1 (go1.6.3; darwin; amd64) S3Manager 
Authorization: AWS4-HMAC-SHA256 Credential= *****/20160806/us-east-1/s3/aws4_request, SignedHeaders=host;if-modified-since;range;x-amz-content-sha256;x-amz-date, Signature= ***** 
If-Modified-Since: Mon, 1 Jan 0001 00:00:00 GMT 
Range: bytes=0-5242879 
X-Amz-Content-Sha256: ***** 
X-Amz-Date: 20160806T223302Z 
+0

これは、その後修正され、リリースされたAmazonコードの欠陥に終わった。 –

答えて

0

は、この単純化してみてください:

var t time.Time 
if fi, err2 := os.Stat(finalFilePath); err2 == nil { 
    t := fi.ModTime() 
} 

以降:

params := &s3.GetObjectInput{Bucket: aws.String(bucket), 
    Key: aws.String(filename), 
    IfModifiedSince: aws.Time(t)} 

...ここでのコード例で提案されているように:https://github.com/aws/aws-sdk-go/blob/f1e26250235022af782521266389e4b2ae2945e4/service/s3/examples_test.go#L975

最初に私はそれがだと思いました消去の問題ですが、テストの後、私はの値がtはブロックをエスケープすることを指していた(正直に私を驚かせた)。たぶん、2つの間に起こっている他のバグがあるかもしれませんが、テストが合格しているので、これはうまくいくはずです。

+0

私はその修正を試みましたが、まだ見ています: 'If-Modified-Since:Mon、1 Jan 0001 00:00:00 GMT' –

+0

FWIW、彼らのテストはIfModifiedSinceヘッダーに対処しません。私はAWSでオープンチケットを持っています。 –

+0

申し訳ありません...ベストを尽くしました。そのチケットで幸運を祈る!それがどうなるか教えてください。 –

関連する問題