99 lines
2.2 KiB
Go
99 lines
2.2 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/"
|
|
}
|