Загрузка изображений S3 вместо отображения при загрузке с Golang - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь загрузить изображение на AWS S3. Изображения сохраняются в корзине, но когда я нажимаю на них (их URL), они загружаются вместо отображения. В прошлом это происходило из-за того, что тип контента не был установлен на image / jpeg, но на этот раз я подтвердил, что это так.

Вот мой код:

func UploadImageToS3(file os.File) error {

    fi, err := file.Stat() // get FileInfo
    if err != nil {
        return errors.New("Couldn't get FileInfo")
    }
    size := fi.Size()
    buffer := make([]byte, size)
    file.Read(buffer)
    tempFileName := "images/picturename.jpg" // key to save under

    putObject := &s3.PutObjectInput{
        Bucket:               aws.String("mybucket"),
        Key:                  aws.String(tempFileName),
        ACL:                  aws.String("public-read"), 
        Body:                 bytes.NewReader(buffer),
        ContentLength:        aws.Int64(int64(size)),

        // verified is properly getting image/jpeg
        ContentType:          aws.String(http.DetectContentType(buffer)),
    }

    _, err = AwsS3.PutObject(putObject)
    if err != nil {
        log.Fatal(err.Error())
        return err
    }
    return nil

}

Я также пытался сделать мой s3.PutObjectInput как

putObject := &s3.PutObjectInput{
        Bucket: aws.String("mybucket"),
        Key:    aws.String(tempFileName),
        ACL:                  aws.String("public-read"), 
        Body: bytes.NewReader(buffer),
        ContentLength:        aws.Int64(int64(size)),
        ContentType: aws.String(http.DetectContentType(buffer)),
        ContentDisposition:   aws.String("attachment"),
        ServerSideEncryption: aws.String("AES256"),
        StorageClass:         aws.String("INTELLIGENT_TIERING"),
    }

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 06 апреля 2020

Разобрался. Не совсем уверен, почему, но мне нужно было разделить все значения.

var size int64 = fi.Size()
    buffer := make([]byte, size)
    file.Read(buffer)

    fileBytes := bytes.NewReader(buffer)
    fileType := http.DetectContentType(buffer)
    path := "images/test.jpeg"
    params := &s3.PutObjectInput{
        Bucket:        aws.String("mybucket"),
        Key:           aws.String(path),
        Body:          fileBytes,
        ContentLength: aws.Int64(size),
        ContentType:   aws.String(fileType),
    }
    _, err = AwsS3.PutObject(params)

Если кто-нибудь знает, почему это работает, а предыдущий код - нет, пожалуйста, поделитесь.

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