132 lines
2.6 KiB
Go
132 lines
2.6 KiB
Go
package sysStorage
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"github.com/google/uuid"
|
|
"io"
|
|
"mime/multipart"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type LocalStorage struct {
|
|
basePath string
|
|
FileUrl string
|
|
}
|
|
|
|
func NewLocalStorage(basePath, fileUrl string) *LocalStorage {
|
|
if basePath == "" {
|
|
var err error
|
|
basePath, err = os.Getwd()
|
|
if err != nil {
|
|
panic("Failed to get current directory: " + err.Error())
|
|
}
|
|
}
|
|
|
|
if err := os.MkdirAll(basePath, os.ModePerm); err != nil {
|
|
panic("Failed to create storage directory: " + err.Error())
|
|
}
|
|
fileUrl = "http://" + fileUrl
|
|
return &LocalStorage{basePath: basePath, FileUrl: fileUrl}
|
|
}
|
|
|
|
func (ls *LocalStorage) Upload(
|
|
file *multipart.FileHeader,
|
|
streamerID int,
|
|
) (string, error) {
|
|
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
|
|
}
|
|
}
|
|
|
|
fileName := ls.ensureUniqueFileName(
|
|
dirPath,
|
|
file.Filename,
|
|
)
|
|
|
|
f, err := os.Create(dirPath + "/" + fileName)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer f.Close()
|
|
|
|
srcFile, err := file.Open()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer srcFile.Close()
|
|
|
|
_, err = io.Copy(f, srcFile)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return fileName, nil
|
|
}
|
|
|
|
func (ls *LocalStorage) Download(
|
|
filename string,
|
|
folder string,
|
|
) ([]byte, error) {
|
|
f, err := os.Open(ls.basePath + "/" + folder + "/" + filename)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
|
|
var fileBuffer bytes.Buffer
|
|
_, err = io.Copy(&fileBuffer, f)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return fileBuffer.Bytes(), nil
|
|
}
|
|
|
|
func (ls *LocalStorage) Delete(
|
|
filename string,
|
|
extension string,
|
|
filePath string,
|
|
) error {
|
|
fileFullPath := filePath + "/" + filename + "." + extension
|
|
|
|
err := os.Remove(fileFullPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ls *LocalStorage) DownloadLink(
|
|
fileId uuid.UUID,
|
|
) string {
|
|
return ls.FileUrl + "/api/widget/files/" + fileId.String()
|
|
}
|
|
|
|
func (ls *LocalStorage) ensureUniqueFileName(
|
|
dirPath, fileName string,
|
|
) string {
|
|
ext := filepath.Ext(fileName)
|
|
name := strings.TrimSuffix(fileName, ext) // Имя файла без расширения
|
|
newFileName := fileName // Начальное имя файла
|
|
counter := 1 // Счётчик для уникальности
|
|
|
|
for {
|
|
filePath := filepath.Join(dirPath, newFileName)
|
|
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
|
break
|
|
}
|
|
newFileName = fmt.Sprintf("%s(%d)%s", name, counter, ext)
|
|
counter++
|
|
}
|
|
|
|
return newFileName
|
|
}
|