Существует ли AWS S3 Go API для чтения файлов вместо загрузки файлов? - PullRequest
0 голосов
/ 03 февраля 2020

Существует ли API для чтения aws s3 файла в Go, я только нахожу API для загрузки файла на локальный компьютер, а затем считываю локальный загруженный файл, но мне нужно прочитать файл в потоке (например, чтение локального файла).

Я хочу иметь возможность читать файл в режиме реального времени, например, читать 100 байт, что-то делать для 100 байтов, и прочитайте последний файл. Я нахожу только API Go aws s3 для загрузки всего файла на локальный компьютер и обработчик загруженного локального файла.

Мой текущий тестовый код - это

func main() {
    bucket := "private bucket"
    item := "private item"

    file, err := os.Create("local path")
    if err != nil {
        exitErrorf("Unable to open file %q, %v", item, err)
    }

    defer file.Close()

    sess, _ := session.NewSession(&aws.Config{
        Region: aws.String(" ")},
    )

    downloader := s3manager.NewDownloader(sess)

    numBytes, err := downloader.Download(file,
        &s3.GetObjectInput{
            Bucket: aws.String(bucket),
            Key:    aws.String(item),
        })

    // Handle the downloaded file
    scanner := bufio.NewScanner(file)

    for scanner.Scan() {             
        // Do something
    }
}

Я скачаю файл с s3 на локальный компьютер, а затем открою загруженный файл и обработаю каждый байт.

Интересно, могу ли я непосредственно прочитать каждую строку файла (или прочитать каждые 100 байтов файла) из s3

1 Ответ

0 голосов
/ 03 февраля 2020

Насколько я понимаю, вам, вероятно, понадобится запрос Range для получения фрагмента файла по фрагменту.
Вот некоторый псевдокод:

// Setup input
input := &s3.GetObjectInput{
    Bucket: aws.String(BucketName),
    Key:    aws.String(Path),
}

// calculate position
input.Range = aws.String(fmt.Sprintf("bytes=%d-%d", Position, Offset))

// Get particular chunk of object
result, err := o.Service().GetObject(input)
if err != nil {
    return nil, err
}
defer result.Body.Close()

// Read the chunk
b, err := ioutil.ReadAll(result.Body)

Или, если вы в каком-то случае нужен файл сразу (я не могу рекомендовать его), просто опустите Range и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...