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  }