diff --git a/internal/api/routes/files.go b/internal/api/routes/files.go index 3a3f48e..09a8cbb 100644 --- a/internal/api/routes/files.go +++ b/internal/api/routes/files.go @@ -16,10 +16,14 @@ import ( "stereo.cat/backend/internal/types" ) -func intoReader(buf []byte) io.Reader { - return io.NopCloser(bytes.NewBuffer(buf)) -} +func getLengthFromReader(r io.Reader) (io.Reader, int64, error) { + buf, err := io.ReadAll(r) + if err != nil { + return nil, 0, err + } + return io.NopCloser(bytes.NewBuffer(buf)), int64(len(buf)), nil +} func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { api.POST("/upload", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { @@ -44,20 +48,14 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { } fileReader, err := file.Open() + if err != nil { c.JSON(500, gin.H{"error": "couldn't open file"}) log.Println(err) return } - buf, err := io.ReadAll(fileReader) - if err != nil { - c.JSON(500, gin.H{"error": "couldn't open file"}) - log.Println(err) - return - } - - fileType, err := filetype.Match(buf) + fileType, err := filetype.MatchReader(fileReader) if err != nil { c.JSON(500, gin.H{"error": "couldn't open file"}) @@ -68,8 +66,8 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { fileMeta := types.File{ Owner: uid, CreatedAt: time.Now(), - Size: int64(len(buf)), - Mime: fileType.MIME.Value, + Size: file.Size, + Extension: fileType.Extension, } if err := cfg.Database.Create(&fileMeta).Error; err != nil { @@ -77,7 +75,15 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { return } - _, err = cfg.MinioClient.PutObject(cfg.Context, cfg.Bucket, fileMeta.ID.String(), intoReader(buf), fileMeta.Size, minio.PutObjectOptions{ContentType: fileMeta.Mime}) + newReader, length, err := getLengthFromReader(fileReader) + + if err != nil { + c.JSON(500, gin.H{"error": "couldn't open file"}) + log.Println(err) + return + } + + _, err = cfg.MinioClient.PutObject(cfg.Context, cfg.Bucket, fileMeta.ID.String(), newReader, length, minio.PutObjectOptions{ContentType: fileType.MIME.Value}) if err != nil { c.JSON(500, gin.H{"error": "failed to upload file"}) @@ -160,7 +166,21 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { return } - c.DataFromReader(200, file.Size, file.Mime, object, nil) + stat, err := object.Stat() + if err != nil { + c.JSON(500, gin.H{"error": "failed to retrieve file"}) + log.Println(err) + return + } + + fileType := filetype.GetType(file.Extension) + if err != nil { + c.JSON(500, gin.H{"error": "failed to retrieve file"}) + log.Println(err) + return + } + + c.DataFromReader(200, stat.Size, fileType.MIME.Value, object, nil) }) api.GET("/list", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { diff --git a/internal/types/types.go b/internal/types/types.go index eeb81c2..70ab2cb 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -35,7 +35,7 @@ type File struct { Owner string `gorm:"not null;index"` Size int64 `gorm:"not null;type:bigint"` CreatedAt time.Time `gorm:"autoCreateTime"` - Mime string + Extension string } func (f *File) BeforeCreate(tx *gorm.DB) (err error) {