From 4e8ab75211a535b668d59892c3104ac4452eaa29 Mon Sep 17 00:00:00 2001
From: HFO4 <912394456@qq.com>
Date: Fri, 16 Dec 2022 16:54:58 +0800
Subject: [PATCH] feat(s3): support setting for force using path style endpoint
 (#1559)

---
 models/policy.go                    |  5 ++++-
 pkg/filesystem/driver/s3/handler.go | 14 +++++++-------
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/models/policy.go b/models/policy.go
index efe36e4..f1e0202 100644
--- a/models/policy.go
+++ b/models/policy.go
@@ -65,6 +65,9 @@ type PolicyOption struct {
 	TPSLimit float64 `json:"tps_limit,omitempty"`
 	// 每秒 API 请求爆发上限
 	TPSLimitBurst int `json:"tps_limit_burst,omitempty"`
+	// Set this to `true` to force the request to use path-style addressing,
+	// i.e., `http://s3.amazonaws.com/BUCKET/KEY `
+	S3ForcePathStyle bool `json:"s3_path_style"`
 }
 
 // thumbSuffix 支持缩略图处理的文件扩展名
@@ -122,7 +125,7 @@ func (policy *Policy) BeforeSave() (err error) {
 	return err
 }
 
-//SerializeOptions 将序列后的Option写入到数据库字段
+// SerializeOptions 将序列后的Option写入到数据库字段
 func (policy *Policy) SerializeOptions() (err error) {
 	optionsValue, err := json.Marshal(&policy.OptionsSerialized)
 	policy.Options = string(optionsValue)
diff --git a/pkg/filesystem/driver/s3/handler.go b/pkg/filesystem/driver/s3/handler.go
index cc2d1de..9280a63 100644
--- a/pkg/filesystem/driver/s3/handler.go
+++ b/pkg/filesystem/driver/s3/handler.go
@@ -41,7 +41,7 @@ type UploadPolicy struct {
 	Conditions []interface{} `json:"conditions"`
 }
 
-//MetaData 文件信息
+// MetaData 文件信息
 type MetaData struct {
 	Size uint64
 	Etag string
@@ -71,7 +71,7 @@ func (handler *Driver) InitS3Client() error {
 			Credentials:      credentials.NewStaticCredentials(handler.Policy.AccessKey, handler.Policy.SecretKey, ""),
 			Endpoint:         &handler.Policy.Server,
 			Region:           &handler.Policy.OptionsSerialized.Region,
-			S3ForcePathStyle: aws.Bool(true),
+			S3ForcePathStyle: &handler.Policy.OptionsSerialized.S3ForcePathStyle,
 		})
 
 		if err != nil {
@@ -289,17 +289,17 @@ func (handler *Driver) Source(
 		return "", err
 	}
 
+	contentDescription := aws.String("attachment; filename=\"" + url.PathEscape(fileName) + "\"")
+	if !isDownload {
+		contentDescription = nil
+	}
 	req, _ := handler.svc.GetObjectRequest(
 		&s3.GetObjectInput{
 			Bucket:                     &handler.Policy.BucketName,
 			Key:                        &path,
-			ResponseContentDisposition: aws.String("attachment; filename=\"" + url.PathEscape(fileName) + "\""),
+			ResponseContentDisposition: contentDescription,
 		})
 
-	if ttl == 0 {
-		ttl = 3600
-	}
-
 	signedURL, err := req.Presign(time.Duration(ttl) * time.Second)
 	if err != nil {
 		return "", err