From ee252638cb3dad3bb853a694e91a6807a767cf41 Mon Sep 17 00:00:00 2001 From: harold Date: Wed, 5 Mar 2025 19:59:28 +0500 Subject: [PATCH] add upload file extension --- infrastructure/sysStorage/sysStorage.go | 15 ++++++++++++--- internal/model/models.go | 2 +- internal/model/sql/model.go | 2 +- internal/repository/file/file.go | 18 ++++++++++++------ sql/init.sql | 5 +++-- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/infrastructure/sysStorage/sysStorage.go b/infrastructure/sysStorage/sysStorage.go index 18c13cf..e931f3a 100644 --- a/infrastructure/sysStorage/sysStorage.go +++ b/infrastructure/sysStorage/sysStorage.go @@ -5,6 +5,7 @@ import ( "io" "mime/multipart" "os" + "strconv" ) type LocalStorage struct { @@ -30,20 +31,28 @@ func (ls *LocalStorage) Upload( file *multipart.FileHeader, streamerID int, ) error { - f, err := os.Create(ls.basePath + "/" + string(rune(streamerID)) + "/" + file.Filename) + dirPath := ls.basePath + "/" + strconv.Itoa(streamerID) + + if _, err := os.Stat(dirPath); os.IsNotExist(err) { + if err := os.MkdirAll(dirPath, os.ModePerm); err != nil { + return err + } + } + + f, err := os.Create(dirPath + "/" + file.Filename) if err != nil { return err } defer f.Close() - // Открываем файл из multipart.FileHeader + // Открываем загруженный файл srcFile, err := file.Open() if err != nil { return err } defer srcFile.Close() - // Копируем содержимое из исходного файла в новый файл + // Копируем содержимое в новый файл _, err = io.Copy(f, srcFile) if err != nil { return err diff --git a/internal/model/models.go b/internal/model/models.go index 3ccf600..57c489e 100644 --- a/internal/model/models.go +++ b/internal/model/models.go @@ -8,7 +8,7 @@ type File struct { ID string `json:"id"` FileName string `json:"file_name"` Extension string `json:"extension"` - Type string `json:"type"` + FileType string `json:"file_type"` } type Widget struct { diff --git a/internal/model/sql/model.go b/internal/model/sql/model.go index bc9a346..4d102e3 100644 --- a/internal/model/sql/model.go +++ b/internal/model/sql/model.go @@ -20,7 +20,7 @@ CREATE TABLE IF NOT EXISTS widgets ( CREATE TABLE IF NOT EXISTS files ( id UUID NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(), - file_type VARCHAR(15) NOT NOT NULL, + file_type VARCHAR(15) NOT NULL, extension VARCHAR(10) NOT NULL, streamer_id INTEGER NOT NULL, created_at TIMESTAMP DEFAULT now() diff --git a/internal/repository/file/file.go b/internal/repository/file/file.go index f47e507..dbb5f40 100644 --- a/internal/repository/file/file.go +++ b/internal/repository/file/file.go @@ -4,6 +4,8 @@ import ( "context" "donat-widget/internal/model" "donat-widget/internal/model/sql" + "fmt" + "github.com/google/uuid" "github.com/jackc/pgx/v5" "mime/multipart" ) @@ -35,19 +37,23 @@ func (fileRepo *RepoFile) AddNew( "file_type": fileType, "extension": extension, } - fileID, err := fileRepo.db.Insert(ctx, sql.AddNewFile, args) + fileIDRaw, err := fileRepo.db.Insert(ctx, sql.AddNewFile, args) if err != nil { return "", err } - err = fileRepo.storage.Upload( - &file, - streamerID, - ) + fileIDBytes, ok := fileIDRaw.([16]uint8) + if !ok { + return "", fmt.Errorf("unexpected fileID type: %T", fileIDRaw) + } + + fileID := uuid.UUID(fileIDBytes).String() + + err = fileRepo.storage.Upload(&file, streamerID) if err != nil { return "", err } - return fileID.(string), nil + return fileID, nil } diff --git a/sql/init.sql b/sql/init.sql index 84b16ed..bf0d268 100644 --- a/sql/init.sql +++ b/sql/init.sql @@ -3,8 +3,9 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Create tables CREATE TABLE IF NOT EXISTS files ( - id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), - type VARCHAR(15) NOT NULL, + id UUID NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(), + file_type VARCHAR(15) NOT NULL, + file_name VARCHAR(50) NOT NULL, extension VARCHAR(10) NOT NULL, streamer_id INTEGER NOT NULL, created_at TIMESTAMP DEFAULT now()