2022-09-04 19:45:39 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"image"
|
|
|
|
"image/jpeg"
|
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
existing_backends = append(existing_backends, "local")
|
|
|
|
}
|
|
|
|
|
|
|
|
type LocalFileBackend struct {
|
|
|
|
BaseDir string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) getPath(box, name string) string {
|
|
|
|
return path.Join(l.BaseDir, box, name+".jpg")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) DeletePicture(box, name string) error {
|
|
|
|
return os.Remove(l.getPath(box, name))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) ServeFile() http.Handler {
|
|
|
|
return http.FileServer(http.Dir(l.BaseDir))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) createPictureInfo(local_path, name string, file os.FileInfo) *Picture {
|
|
|
|
return &Picture{
|
|
|
|
local_path, // Path
|
|
|
|
name, // Basename
|
|
|
|
name[:len(name)-len(path.Ext(name))], // Sanitized filename
|
|
|
|
file.ModTime(), // UploadTime
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) GetPicture(box, name string, w io.Writer) error {
|
|
|
|
local_path := l.getPath(box, name)
|
|
|
|
|
|
|
|
fd, err := os.Open(local_path)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer fd.Close()
|
|
|
|
|
|
|
|
_, err = io.Copy(w, fd)
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) GetPictureInfo(box, name string) (*Picture, error) {
|
|
|
|
local_path := l.getPath(box, name)
|
|
|
|
|
|
|
|
file, err := os.Stat(local_path)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return l.createPictureInfo(path.Join(box, name+".jpg"), name, file), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) ListPictures(box string) ([]*Picture, error) {
|
|
|
|
files, err := ioutil.ReadDir(path.Join(l.BaseDir, box))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2022-09-04 20:45:30 +00:00
|
|
|
pictures := make([]*Picture, 0)
|
2022-09-04 19:45:39 +00:00
|
|
|
for _, file := range files {
|
|
|
|
if !file.IsDir() {
|
|
|
|
pictures = append(pictures, l.createPictureInfo(path.Join(box, file.Name()), file.Name(), file))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return pictures, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) MovePicture(box_from, box_to, name string) error {
|
|
|
|
newpath := l.getPath(box_to, name)
|
|
|
|
|
|
|
|
err := os.Rename(
|
|
|
|
l.getPath(box_from, name),
|
|
|
|
newpath,
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return os.Chtimes(newpath, time.Now(), time.Now())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *LocalFileBackend) PutPicture(box, name string, img *image.Image) error {
|
|
|
|
fd, err := os.OpenFile(l.getPath(box, name), os.O_RDWR|os.O_CREATE, 0644)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer fd.Close()
|
|
|
|
|
|
|
|
return jpeg.Encode(fd, *img, nil)
|
|
|
|
}
|