Go: Как отправить файл из AWS S3 через GIN-Router в виде двоичного потока в браузер?

Как я могу отправить файл, полученный от S3, в Gin в качестве двоичного ответа?

Допустим, у меня есть следующий код для получения изображения из корзины S3:

response, err := i.s3Client.GetObject(context.TODO(), &s3.GetObjectInput{
    Bucket: aws.String("test"),
    Key:    aws.String(filename),
})

Как передать этот ответ в контекст ответа Gin-router?

Я мог бы сделать что-то вроде:

body, err := ioutil.ReadAll(response.Body)
if err != nil {
    ctx.JSON(http.StatusBadRequest, err)
    return
}

Но как сказать джину, чтобы он служил в качестве вывода? Что приходит мне на ум, но не работает:

ctx.Header("Content-Type", *response.ContentType)
ctx.Header("Cache-control", "max-age = "+strconv.Itoa(60*60*24*365))
ctx.Write(body)

Что-нибудь, что я могу сделать здесь?

body, err := ioutil.ReadAll(response.Body) избегайте этого шаблона. Приведенный ниже ответ будет передавать данные из s3 в веб-клиент без необходимости хранить весь контент в памяти, поэтому потребление памяти для больших объектов будет значительно ниже.
Daniel Farrell 02.04.2022 18:17
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
3
1
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы почти закончили:

Вместо ctx.Write используйте этот:

ctx.DataFromReader(200, response.ContentLength, *response.ContentType, response.Body, nil)

Другие вопросы по теме