From 4199fc84e7f70df8c69e164d1885fe3056242256 Mon Sep 17 00:00:00 2001 From: Joakim Olsson Date: Thu, 16 Apr 2026 10:45:23 +0200 Subject: [PATCH] feat: add PresignInlineURL method for inline content display Generates presigned URLs with Content-Disposition: inline and optional Content-Type override, so browsers render content (e.g. PDFs) directly instead of triggering a download dialog. --- s3.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/s3.go b/s3.go index 0a3a266..e7abdb8 100644 --- a/s3.go +++ b/s3.go @@ -105,6 +105,25 @@ func (s *S3) PresignURL(ctx context.Context, key string) (string, error) { return req.URL, nil } +// PresignInlineURL generates a presigned URL that tells the browser to display +// the content inline rather than triggering a download. The URL is valid for +// 15 minutes. +func (s *S3) PresignInlineURL(ctx context.Context, key string, contentType string) (string, error) { + input := &s3.GetObjectInput{ + Bucket: aws.String(s.bucket), + Key: aws.String(key), + ResponseContentDisposition: aws.String("inline"), + } + if contentType != "" { + input.ResponseContentType = aws.String(contentType) + } + req, err := s.presigner.PresignGetObject(ctx, input, s3.WithPresignExpires(15*time.Minute)) + if err != nil { + return "", err + } + return req.URL, nil +} + // New creates a new S3 storage instance using the upload manager // This loads AWS config from the default locations and is suitable for most use cases func New(bucket string) (*S3, error) {