Files
bibliomane/internal/fileutils/fileutils.go

110 lines
2.4 KiB
Go

package fileutils
import (
"io"
"mime"
"mime/multipart"
"net/http"
"net/url"
"os"
"path/filepath"
"strconv"
"strings"
"git.artlef.fr/bibliomane/internal/appcontext"
"git.artlef.fr/bibliomane/internal/model"
)
func SaveStaticFile(ac *appcontext.AppContext, file *multipart.FileHeader) (model.StaticFile, error) {
filename := file.Filename
filepath := computePathFromName(ac, filename)
err := ac.C.SaveUploadedFile(file, ac.Config.ImageFolderPath+"/"+filepath)
if err != nil {
return model.StaticFile{}, err
}
staticFile := model.StaticFile{
Name: filename,
Path: filepath,
}
ac.Db.Save(&staticFile)
return staticFile, nil
}
func DownloadFile(ac appcontext.AppContext, fileUrl string) (model.StaticFile, error) {
var staticFile model.StaticFile
u, err := url.Parse(fileUrl)
if err != nil {
return staticFile, err
}
path := u.Path
segments := strings.Split(path, "/")
fileName := segments[len(segments)-1]
response, err := http.Get(fileUrl)
if err != nil {
return staticFile, err
}
defer response.Body.Close()
//get file extension from http header if needed
if filepath.Ext(fileName) == "" {
contentType := response.Header.Get("content-type")
if contentType != "" {
extensions, err := mime.ExtensionsByType(contentType)
if err != nil {
return staticFile, err
}
if len(extensions) > 0 {
fileName = fileName + extensions[0]
}
}
}
filePath := computePathFromName(&ac, fileName)
file, err := os.Create(ac.Config.ImageFolderPath + "/" + filePath)
if err != nil {
return staticFile, err
}
defer file.Close()
_, err = io.Copy(file, response.Body)
if err != nil {
return staticFile, err
}
staticFile = model.StaticFile{
Name: fileName,
Path: filePath,
}
err = ac.Db.Save(&staticFile).Error
return staticFile, err
}
func computePathFromName(ac *appcontext.AppContext, filename string) string {
var existingFiles []model.StaticFile
ac.Db.Where("name = ?", filename).Find(&existingFiles)
l := len(existingFiles)
if l == 0 {
return filename
} else {
extension := filepath.Ext(filename)
basename := filename[:len(filename)-len(extension)]
return basename + "-" + strconv.Itoa(l) + extension
}
}
func GetWsLinkPrefix() string {
return "/static/bookcover/"
}
func CreateFolderIfMissing(dir string) error {
_, openFileErr := os.Open(dir)
if os.IsNotExist(openFileErr) {
return os.MkdirAll(dir, 0755)
} else if openFileErr != nil {
return openFileErr
} else {
return nil
}
}