2016-10-25 2 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.

Смежные вопросы