| @@ -290,7 +290,6 @@ github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww | |||||
| github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= | github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= | ||||
| github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= | github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4= | ||||
| github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | ||||
| github.com/go-resty/resty v1.12.0 h1:L1P5qymrXL5H/doXe2pKUr1wxovAI5ilm2LdVLbwThc= | |||||
| github.com/go-resty/resty/v2 v2.3.0 h1:JOOeAvjSlapTT92p8xiS19Zxev1neGikoHsXJeOq8So= | github.com/go-resty/resty/v2 v2.3.0 h1:JOOeAvjSlapTT92p8xiS19Zxev1neGikoHsXJeOq8So= | ||||
| github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= | github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= | ||||
| github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= | github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= | ||||
| @@ -842,8 +841,6 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLL | |||||
| golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= | golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= | ||||
| golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y= | |||||
| golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | |||||
| golang.org/x/net v0.0.0-20200513185701-a91f0712d120 h1:EZ3cVSzKOlJxAd8e8YAJ7no8nNypTxexh/YE/xW3ZEY= | golang.org/x/net v0.0.0-20200513185701-a91f0712d120 h1:EZ3cVSzKOlJxAd8e8YAJ7no8nNypTxexh/YE/xW3ZEY= | ||||
| golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= | ||||
| golang.org/x/oauth2 v0.0.0-20180620175406-ef147856a6dd/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | golang.org/x/oauth2 v0.0.0-20180620175406-ef147856a6dd/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| @@ -309,6 +309,7 @@ var ( | |||||
| Bucket string | Bucket string | ||||
| Location string | Location string | ||||
| BasePath string | BasePath string | ||||
| RealPath string | |||||
| } | } | ||||
| AllowedTypes string | AllowedTypes string | ||||
| MaxSize int64 | MaxSize int64 | ||||
| @@ -324,6 +325,7 @@ var ( | |||||
| Bucket string | Bucket string | ||||
| Location string | Location string | ||||
| BasePath string | BasePath string | ||||
| RealPath string | |||||
| }{}, | }{}, | ||||
| AllowedTypes: "image/jpeg,image/png,application/zip,application/gzip", | AllowedTypes: "image/jpeg,image/png,application/zip,application/gzip", | ||||
| MaxSize: 4, | MaxSize: 4, | ||||
| @@ -892,6 +894,7 @@ func NewContext() { | |||||
| Attachment.Minio.Location = sec.Key("MINIO_LOCATION").MustString("us-east-1") | Attachment.Minio.Location = sec.Key("MINIO_LOCATION").MustString("us-east-1") | ||||
| Attachment.Minio.BasePath = sec.Key("MINIO_BASE_PATH").MustString("attachments/") | Attachment.Minio.BasePath = sec.Key("MINIO_BASE_PATH").MustString("attachments/") | ||||
| Attachment.Minio.UseSSL = sec.Key("MINIO_USE_SSL").MustBool(false) | Attachment.Minio.UseSSL = sec.Key("MINIO_USE_SSL").MustBool(false) | ||||
| Attachment.Minio.RealPath = sec.Key("MINIO_REAL_PATH").MustString("/mnt/test/minio/data/") | |||||
| } | } | ||||
| Attachment.AllowedTypes = strings.Replace(sec.Key("ALLOWED_TYPES").MustString("image/jpeg,image/png,application/zip,application/gzip"), "|", ",", -1) | Attachment.AllowedTypes = strings.Replace(sec.Key("ALLOWED_TYPES").MustString("image/jpeg,image/png,application/zip,application/gzip"), "|", ",", -1) | ||||
| @@ -644,6 +644,7 @@ download_count = 下载统计 | |||||
| edit=编辑 | edit=编辑 | ||||
| private=私有 | private=私有 | ||||
| public=公有 | public=公有 | ||||
| dir=目录 | |||||
| back=返回 | back=返回 | ||||
| copy_url=复制下载链接 | copy_url=复制下载链接 | ||||
| visibility=可见性 | visibility=可见性 | ||||
| @@ -5,12 +5,6 @@ | |||||
| package repo | package repo | ||||
| import ( | import ( | ||||
| contexExt "context" | |||||
| "fmt" | |||||
| "net/http" | |||||
| "strconv" | |||||
| "strings" | |||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| @@ -18,6 +12,15 @@ import ( | |||||
| "code.gitea.io/gitea/modules/storage" | "code.gitea.io/gitea/modules/storage" | ||||
| "code.gitea.io/gitea/modules/upload" | "code.gitea.io/gitea/modules/upload" | ||||
| "code.gitea.io/gitea/modules/worker" | "code.gitea.io/gitea/modules/worker" | ||||
| contexExt "context" | |||||
| "encoding/json" | |||||
| "fmt" | |||||
| "io/ioutil" | |||||
| "net/http" | |||||
| "path" | |||||
| "strconv" | |||||
| "strings" | |||||
| "time" | |||||
| gouuid "github.com/satori/go.uuid" | gouuid "github.com/satori/go.uuid" | ||||
| ) | ) | ||||
| @@ -28,6 +31,12 @@ const ( | |||||
| DecompressFailed = "1" | DecompressFailed = "1" | ||||
| ) | ) | ||||
| type FileInfo struct { | |||||
| FileName string | |||||
| ModTime time.Time | |||||
| IsDir bool | |||||
| } | |||||
| func RenderAttachmentSettings(ctx *context.Context) { | func RenderAttachmentSettings(ctx *context.Context) { | ||||
| renderAttachmentSettings(ctx) | renderAttachmentSettings(ctx) | ||||
| } | } | ||||
| @@ -351,3 +360,44 @@ func HandleUnDecompressAttachment() { | |||||
| return | return | ||||
| } | } | ||||
| func GetDir(ctx *context.Context) { | |||||
| uuid := ctx.Query("uuid") | |||||
| //todo: 查询解压状态成功之后才能查看文件目录 | |||||
| files, err := ioutil.ReadDir(setting.Attachment.Minio.RealPath + setting.Attachment.Minio.Bucket + "/" + setting.Attachment.Minio.BasePath + | |||||
| path.Join(uuid[0:1], uuid[1:2], uuid + uuid) + "/" + ctx.Query("parentDir")) | |||||
| if err != nil { | |||||
| log.Error("ReadDir failed:", err.Error()) | |||||
| ctx.ServerError("ReadDir failed:", err) | |||||
| return | |||||
| } | |||||
| i := 1 | |||||
| var fileInfos []FileInfo | |||||
| for _, file := range files { | |||||
| if i > 100 { | |||||
| break | |||||
| } | |||||
| fileInfos = append(fileInfos, FileInfo{ | |||||
| FileName:file.Name(), | |||||
| ModTime:file.ModTime(), | |||||
| IsDir:file.IsDir(), | |||||
| }) | |||||
| i++ | |||||
| } | |||||
| tmp, err := json.Marshal(fileInfos) | |||||
| if err != nil { | |||||
| ctx.ServerError("json.Marshal failed:", err) | |||||
| return | |||||
| } | |||||
| log.Info(string(tmp)) | |||||
| ctx.JSON(200, map[string]string{ | |||||
| "uuid": uuid, | |||||
| "fileInfos": string(tmp), | |||||
| }) | |||||
| } | |||||
| @@ -521,6 +521,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| m.Get("/get_pre_url", repo.GetPresignedPutObjectURL) | m.Get("/get_pre_url", repo.GetPresignedPutObjectURL) | ||||
| m.Post("/add", repo.AddAttachment) | m.Post("/add", repo.AddAttachment) | ||||
| m.Post("/private", repo.UpdatePublicAttachment) | m.Post("/private", repo.UpdatePublicAttachment) | ||||
| m.Get("/dir", repo.GetDir) | |||||
| }, reqSignIn) | }, reqSignIn) | ||||
| m.Group("/attachments", func() { | m.Group("/attachments", func() { | ||||
| @@ -18,6 +18,10 @@ | |||||
| <span class="ui text center clipboard" data-clipboard-text="{{.DownloadURL}}" data-tooltip='{{$.i18n.Tr "dataset.copy_url"}}' data-clipboard-action="copy">{{svg "octicon-file" 16}}</span> | <span class="ui text center clipboard" data-clipboard-text="{{.DownloadURL}}" data-tooltip='{{$.i18n.Tr "dataset.copy_url"}}' data-clipboard-action="copy">{{svg "octicon-file" 16}}</span> | ||||
| </div> | </div> | ||||
| <div class="two wide column"> | |||||
| <a class="ui button mini" href="javascript:void(0)" data-uuid={{.UUID}} data-dataset-dir data-dir-url="{{AppSubUrl}}/attachments/dir" data-csrf="{{$.CsrfToken}}">{{$.i18n.Tr "dataset.dir"}}</a> | |||||
| </div> | |||||
| {{if $.Permission.CanWrite $.UnitTypeDatasets}} | {{if $.Permission.CanWrite $.UnitTypeDatasets}} | ||||
| <div class="three wide column"> | <div class="three wide column"> | ||||
| <div class="ui buttons mini"> | <div class="ui buttons mini"> | ||||
| @@ -1130,6 +1130,19 @@ async function initRepository() { | |||||
| } | } | ||||
| }).modal('show'); | }).modal('show'); | ||||
| }); | }); | ||||
| $('[data-dataset-dir]').on('click', function () { | |||||
| const $this = $(this); | |||||
| $.get($this.data('dir-url'), { | |||||
| _csrf: $this.data('csrf'), | |||||
| uuid: $this.data('uuid'), | |||||
| //parentDir: $this.data('parentDir') | |||||
| parentDir: "test" | |||||
| }).done((_data) => { | |||||
| $(`#${$this.data('uuid')}`).hide(); | |||||
| }).fail(() => { | |||||
| //window.location.reload(); | |||||
| }); | |||||
| }); | |||||
| $('[data-category-id]').on('click', function () { | $('[data-category-id]').on('click', function () { | ||||
| const category = $(this).data('category-id'); | const category = $(this).data('category-id'); | ||||
| $('#category').val(category); | $('#category').val(category); | ||||