2016-10-25 4 views
0

내가 S3에서 객체를 다운로드하기 위해 노력하고있어 존재하지 않는, 다음은 내 코드입니다 :Golang AWS S3 NoSuchKey : 지정된 키

func listFile(bucket, prefix string) error { 
    svc := s3.New(sess) 
    params := &s3.ListObjectsInput{ 
     Bucket: aws.String(bucket), // Required 
     Prefix: aws.String(prefix), 
    } 
    return svc.ListObjectsPages(params, func(p *s3.ListObjectsOutput, lastPage bool) bool { 
     for _, o := range p.Contents { 
      //log.Println(*o.Key) 
      log.Println(*o.Key) 
      download(bucket, *o.Key) 
      return true 
     } 
     return lastPage 
    }) 
} 

func download(bucket, key string) { 
    logDir := conf.Cfg.Section("share").Key("LOG_DIR").MustString(".") 
    tmpLogPath := filepath.Join(logDir, bucket, key) 
    s3Svc := s3.New(sess) 
    downloader := s3manager.NewDownloaderWithClient(s3Svc, func(d *s3manager.Downloader) { 
     d.PartSize = 2 * 1024 * 1024 // 2MB per part 
    }) 
    f, err := os.OpenFile(tmpLogPath, os.O_CREATE|os.O_WRONLY, 0644) 
    if _, err = downloader.Download(f, &s3.GetObjectInput{ 
     Bucket: aws.String(bucket), 
     Key: aws.String(key), 
    }); err != nil { 
     log.Fatal(err) 
    } 
    f.Close() 
} 

func main() { 
    bucket := "mybucket" 
    key := "myprefix" 
    listFile(bucket, key) 
} 

내가 할 수있는 기능 listFile()에있는 개체의 목록을 얻을 수 있지만, 전화가 다운로드 될 때 404가 반환되는 이유는 무엇입니까?

답변

0

최근 라이브러리 버전에서도 동일한 문제가 발생했습니다. 경우에 따라 객체 키의 접두어는 SDK가 기본적으로 제거하여 다운로드를 실패하게 만드는 "./"로 시작됩니다.

에 한번 당신의 aws.Config이를 추가하고이 도움이되는지는 :

config := aws.Config{ 
    ... 
    DisableRestProtocolURICleaning: aws.Bool(true), 
} 

가 나는 issue를 제출했다.