| @@ -64,3 +64,7 @@ func (l *LocalStorage) Delete(path string) error { | |||||
| p := filepath.Join(l.dir, path) | p := filepath.Join(l.dir, path) | ||||
| return os.Remove(p) | return os.Remove(p) | ||||
| } | } | ||||
| func (l *LocalStorage) PresignedGetURL(path string, fileName string) (string,error) { | |||||
| return "",nil | |||||
| } | |||||
| @@ -6,8 +6,10 @@ package storage | |||||
| import ( | import ( | ||||
| "io" | "io" | ||||
| "net/url" | |||||
| "path" | "path" | ||||
| "strings" | "strings" | ||||
| "time" | |||||
| "github.com/minio/minio-go" | "github.com/minio/minio-go" | ||||
| ) | ) | ||||
| @@ -16,6 +18,8 @@ var ( | |||||
| _ ObjectStorage = &MinioStorage{} | _ ObjectStorage = &MinioStorage{} | ||||
| ) | ) | ||||
| const PRESIGNED_URL_EXPIRE_TIME = time.Hour * 24 * 7 | |||||
| // MinioStorage returns a minio bucket storage | // MinioStorage returns a minio bucket storage | ||||
| type MinioStorage struct { | type MinioStorage struct { | ||||
| client *minio.Client | client *minio.Client | ||||
| @@ -68,3 +72,18 @@ func (m *MinioStorage) Save(path string, r io.Reader) (int64, error) { | |||||
| func (m *MinioStorage) Delete(path string) error { | func (m *MinioStorage) Delete(path string) error { | ||||
| return m.client.RemoveObject(m.bucket, m.buildMinioPath(path)) | return m.client.RemoveObject(m.bucket, m.buildMinioPath(path)) | ||||
| } | } | ||||
| //Get Presigned URL | |||||
| func (m *MinioStorage) PresignedGetURL(path string, fileName string) (string,error) { | |||||
| // Set request parameters for content-disposition. | |||||
| reqParams := make(url.Values) | |||||
| reqParams.Set("response-content-disposition", "attachment; filename=\"" + fileName + "\"") | |||||
| var preURL *url.URL | |||||
| preURL,err := m.client.PresignedGetObject(m.bucket, m.buildMinioPath(path), PRESIGNED_URL_EXPIRE_TIME, reqParams) | |||||
| if err != nil { | |||||
| return "",err | |||||
| } | |||||
| return preURL.String(),nil | |||||
| } | |||||
| @@ -16,6 +16,7 @@ type ObjectStorage interface { | |||||
| Save(path string, r io.Reader) (int64, error) | Save(path string, r io.Reader) (int64, error) | ||||
| Open(path string) (io.ReadCloser, error) | Open(path string) (io.ReadCloser, error) | ||||
| Delete(path string) error | Delete(path string) error | ||||
| PresignedGetURL(path string, fileName string) (string, error) | |||||
| } | } | ||||
| // Copy copys a file from source ObjectStorage to dest ObjectStorage | // Copy copys a file from source ObjectStorage to dest ObjectStorage | ||||
| @@ -5,6 +5,7 @@ | |||||
| package repo | package repo | ||||
| import ( | import ( | ||||
| "code.gitea.io/gitea/modules/storage" | |||||
| "fmt" | "fmt" | ||||
| "net/http" | "net/http" | ||||
| "strings" | "strings" | ||||
| @@ -13,7 +14,6 @@ import ( | |||||
| "code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/setting" | "code.gitea.io/gitea/modules/setting" | ||||
| "code.gitea.io/gitea/modules/storage" | |||||
| "code.gitea.io/gitea/modules/upload" | "code.gitea.io/gitea/modules/upload" | ||||
| ) | ) | ||||
| @@ -124,6 +124,7 @@ func GetAttachment(ctx *context.Context) { | |||||
| } | } | ||||
| //If we have matched and access to release or issue | //If we have matched and access to release or issue | ||||
| /* | |||||
| fr, err := storage.Attachments.Open(attach.RelativePath()) | fr, err := storage.Attachments.Open(attach.RelativePath()) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.ServerError("Open", err) | ctx.ServerError("Open", err) | ||||
| @@ -131,13 +132,29 @@ func GetAttachment(ctx *context.Context) { | |||||
| } | } | ||||
| defer fr.Close() | defer fr.Close() | ||||
| */ | |||||
| url, err := storage.Attachments.PresignedGetURL(attach.RelativePath(), attach.Name) | |||||
| if err != nil { | |||||
| ctx.ServerError("PresignedGetURL", err) | |||||
| return | |||||
| } | |||||
| if err := attach.IncreaseDownloadCount(); err != nil { | if err := attach.IncreaseDownloadCount(); err != nil { | ||||
| ctx.ServerError("Update", err) | ctx.ServerError("Update", err) | ||||
| return | return | ||||
| } | } | ||||
| ctx.JSON(200, map[string]string{ | |||||
| "name": attach.Name, | |||||
| "url": url, | |||||
| }) | |||||
| /* | |||||
| if err = ServeData(ctx, attach.Name, fr); err != nil { | if err = ServeData(ctx, attach.Name, fr); err != nil { | ||||
| ctx.ServerError("ServeData", err) | ctx.ServerError("ServeData", err) | ||||
| return | return | ||||
| } | } | ||||
| */ | |||||
| } | } | ||||