Browse Source

AddAttachment

tags/v1.21.12.1
e 5 years ago
parent
commit
7dae4d3a06
7 changed files with 77 additions and 1 deletions
  1. +10
    -0
      models/attachment.go
  2. +4
    -0
      modules/storage/local.go
  3. +21
    -0
      modules/storage/minio.go
  4. +1
    -0
      modules/storage/storage.go
  5. +5
    -1
      modules/upload/filetype.go
  6. +35
    -0
      routers/repo/attachment.go
  7. +1
    -0
      routers/routes/routes.go

+ 10
- 0
models/attachment.go View File

@@ -303,3 +303,13 @@ func (a *Attachment) LinkedDataSet() (*Dataset, error) {
}
return nil, nil
}

// InsertAttachment insert a record into attachment.
func InsertAttachment(attach *Attachment) (_ *Attachment, err error) {

if _, err := x.Insert(attach); err != nil {
return nil, err
}

return attach, nil
}

+ 4
- 0
modules/storage/local.go View File

@@ -72,3 +72,7 @@ func (l *LocalStorage) PresignedGetURL(path string, fileName string) (string,err
func (l *LocalStorage) PresignedPutURL(path string) (string,error) {
return "",nil
}

func (l *LocalStorage) HasObject(path string) (bool,error) {
return false,nil
}

+ 21
- 0
modules/storage/minio.go View File

@@ -101,3 +101,24 @@ func (m *MinioStorage) PresignedPutURL(path string) (string,error) {

return preURL.String(),nil
}

//check if has the object
func (m *MinioStorage) HasObject(path string) (bool,error) {
hasObject := false
// Create a done channel to control 'ListObjects' go routine.
doneCh := make(chan struct{})

// Indicate to our routine to exit cleanly upon return.
defer close(doneCh)

objectCh := m.client.ListObjects(m.bucket, m.buildMinioPath(path), false, doneCh)
for object := range objectCh {
if object.Err != nil {
return hasObject, object.Err
}

hasObject = true
}

return hasObject,nil
}

+ 1
- 0
modules/storage/storage.go View File

@@ -23,6 +23,7 @@ type ObjectStorage interface {
Delete(path string) error
PresignedGetURL(path string, fileName string) (string, error)
PresignedPutURL(path string) (string, error)
HasObject(path string) (bool, error)
}

// Copy copys a file from source ObjectStorage to dest ObjectStorage


+ 5
- 1
modules/upload/filetype.go View File

@@ -31,11 +31,15 @@ func (err ErrFileTypeForbidden) Error() string {
func VerifyAllowedContentType(buf []byte, allowedTypes []string) error {
fileType := http.DetectContentType(buf)

return VerifyFileType(fileType, allowedTypes)
}

func VerifyFileType(fileType string, allowedTypes []string) error {
for _, t := range allowedTypes {
t := strings.Trim(t, " ")

if t == "*/*" || t == fileType ||
// Allow directives after type, like 'text/plain; charset=utf-8'
// Allow directives after type, like 'text/plain; charset=utf-8'
strings.HasPrefix(fileType, t+";") {
return nil
}


+ 35
- 0
routers/repo/attachment.go View File

@@ -203,6 +203,12 @@ func GetPresignedPutObjectURL(ctx *context.Context) {
return
}

err := upload.VerifyFileType(ctx.Params("file_type"), strings.Split(setting.Attachment.AllowedTypes, ","))
if err != nil {
ctx.Error(400, err.Error())
return
}

if setting.Attachment.StoreType == storage.MinioStorageType {
uuid := gouuid.NewV4().String()
url, err := storage.Attachments.PresignedPutURL(models.AttachmentRelativePath(uuid))
@@ -219,6 +225,35 @@ func GetPresignedPutObjectURL(ctx *context.Context) {
ctx.Error(404, "storage type is not enabled")
return
}
}

// AddAttachment response for add attachment record
func AddAttachment(ctx *context.Context) {
uuid := ctx.Query("uuid")
has,err := storage.Attachments.HasObject(models.AttachmentRelativePath(uuid))
if err != nil {
ctx.ServerError("HasObject", err)
return
}

if !has {
ctx.Error(404, "attachment has not been uploaded")
return
}

_, err = models.InsertAttachment(&models.Attachment{
UUID: uuid,
UploaderID: ctx.User.ID,
Name: ctx.Query("file_name"),
Size: ctx.QueryInt64("size"),
})

if err != nil {
ctx.Error(500, fmt.Sprintf("InsertAttachment: %v", err))
return
}

ctx.JSON(200, map[string]string{
"result_code": "0",
})
}

+ 1
- 0
routers/routes/routes.go View File

@@ -520,6 +520,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Post("", repo.UploadAttachment)
m.Post("/delete", repo.DeleteAttachment)
m.Get("/get_pre_url", repo.GetPresignedPutObjectURL)
m.Post("/add", repo.AddAttachment)
}, reqSignIn)

m.Group("/:username", func() {


Loading…
Cancel
Save