github.com/GregorioDiStefano/go-file-storage@v0.0.0-20161001105139-5707ab351525/controllers/upload.go (about) 1 package controller 2 3 import ( 4 "errors" 5 "fmt" 6 "io" 7 "net/http" 8 "time" 9 10 "github.com/GregorioDiStefano/go-file-storage/log" 11 "github.com/GregorioDiStefano/go-file-storage/models" 12 "github.com/GregorioDiStefano/go-file-storage/utils" 13 "github.com/gin-gonic/gin" 14 ) 15 16 type GenericUploader interface { 17 UploadFile(c *gin.Context) 18 doActualUpload(data io.ReadCloser, key string, fn string) error 19 20 doActualDelete(deleteKey, fileKey, filename string) error 21 } 22 23 type Upload struct { 24 awsBucket string 25 awsRegion string 26 maxUploadSize int64 27 deleteKeySize int 28 29 uploadDomain string 30 } 31 32 func NewUploader(uploadDomain string, maxUploadSize int64, deleteKeySize int, awsBucket, awsRegion string) *Upload { 33 return &Upload{uploadDomain: uploadDomain, 34 maxUploadSize: maxUploadSize, 35 deleteKeySize: deleteKeySize, 36 awsBucket: awsBucket, 37 awsRegion: awsRegion} 38 } 39 40 func checkUploadSize(actualSize, maxFileSize int64) error { 41 if actualSize > maxFileSize || actualSize <= 0 { 42 fmt.Printf("File upload was :%d, while max size allowed is: %d\n", actualSize, maxFileSize) 43 return errors.New("File too large") 44 } 45 return nil 46 } 47 48 func (upload Upload) UploadFile(c *gin.Context) { 49 uploadFileSize := c.Request.ContentLength 50 51 if err := checkUploadSize(uploadFileSize, upload.maxUploadSize); err != nil { 52 sendError(c, "Upload size either too larger or invalid") 53 return 54 } 55 56 fn := c.Param("filename") 57 key := models.DB.FindUnusedKey() 58 deleteKey := utils.RandomString(utils.Config.GetInt("delete_key_size")) 59 60 if err := upload.doActualUpload(c.Request.Body, key, fn); err != nil { 61 log.Error("Uploading file to S3 bucket failed.") 62 sendError(c, "Uploading file to S3 bucket failed!") 63 return 64 } 65 66 simpleStoredFiled := models.StoredFile{ 67 Key: key, 68 DeleteKey: deleteKey, 69 FileName: fn, 70 FileSize: c.Request.ContentLength, 71 UploadTime: time.Now().UTC(), 72 LastAccess: time.Now().UTC(), 73 } 74 75 models.DB.WriteStoredFile(simpleStoredFiled) 76 77 returnJSON := make(map[string]string) 78 returnJSON["downloadURL"] = fmt.Sprintf("%s/%s/%s", upload.uploadDomain, key, fn) 79 returnJSON["deleteURL"] = fmt.Sprintf("%s/%s/%s/%s", upload.uploadDomain, key, deleteKey, fn) 80 log.WithFields(log.Fields{"key": key, "deleteKey": deleteKey, "fn": fn}).Infoln("Upload successful.") 81 c.JSON(http.StatusCreated, returnJSON) 82 }