有人可以告诉我我在这里做错了什么吗?这看起来很简单,但我返回的链接是下载链接,而不是内联查看链接。我到处寻找相同的答案:设置内容类型。我这样做了,结果还是一样。我不确定它是否会改变任何东西,但我通过 Heroku 使用 MinIO S3,这显然与 S3 兼容。
func UploadImageToS3(file []byte, fileName string, contentType string) (string, error) {
bucket := aws.String(config.RetrieveEnv("S3_BUCKET"))
key := aws.String(fmt.Sprintf("images/%s", fileName))
// create a new session
s3Config := &aws.Config{
Credentials: credentials.NewStaticCredentials(config.RetrieveEnv("S3_ACCESS_KEY"), config.RetrieveEnv("S3_SECRET_KEY"), ""),
Endpoint: aws.String(config.RetrieveEnv("S3_ENDPOINT")),
Region: aws.String(config.RetrieveEnv("S3_REGION")),
DisableSSL: aws.Bool(false),
S3ForcePathStyle: aws.Bool(true),
}
newSession, err := session.NewSession(s3Config)
if err != nil {
return "", err
}
s3Client := s3.New(newSession)
_, err = s3Client.PutObject(&s3.PutObjectInput{
Bucket: bucket,
Key: key,
Body: aws.ReadSeekCloser(bytes.NewReader(file)),
ContentDisposition: aws.String(fmt.Sprintf("inline; filename=%s", fileName)),
ContentType: aws.String(contentType),
ACL: aws.String("public-read"),
})
if err != nil {
return "", err
}
return fmt.Sprintf("https://%s/%s/%s", config.RetrieveEnv("S3_ENDPOINT"), *bucket, *key), nil
}
我就是这样做的
req, _ := d.s3Client.GetObjectRequest(
&s3.GetObjectInput{
Bucket: aws.String(d.bucket),
Key: aws.String(clPath),
ResponseContentDisposition: aws.String("inline; filename=\"" + fileName + "\""),
ResponseContentType: aws.String(contentType),
},
)
err := req.Build()
if err != nil {
return "", fmt.Errorf("failed to build get obj request: %w", err)
}
return req.HTTPRequest.URL.String(), nil
这段代码会生成这样的url
https://host/bucket/path?response-content-disposition=inline%3B+filename%3D"128x128.jpg"&response-content-type=image%2Fjpeg