49 lines
1.1 KiB
Go
Executable File
49 lines
1.1 KiB
Go
Executable File
package server
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"gitea.inhome.blapointe.com/local/notes-server/filetree"
|
|
"net/http"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
)
|
|
|
|
func (s *Server) attach(w http.ResponseWriter, r *http.Request) {
|
|
if err := s._attach(w, r); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
}
|
|
|
|
func (s *Server) _attach(w http.ResponseWriter, r *http.Request) error {
|
|
r.ParseMultipartForm(100 << 20)
|
|
file, handler, err := r.FormFile("file")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
ft := filetree.NewPathFromURL(r.URL.Path)
|
|
local := ft.Local
|
|
target := path.Join(path.Dir(local), "."+path.Base(local)+".attachments", handler.Filename)
|
|
|
|
os.MkdirAll(path.Dir(target), os.ModePerm)
|
|
if fi, err := os.Stat(target); err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
} else if err == nil && fi.IsDir() {
|
|
return errors.New("invalid path")
|
|
}
|
|
f, err := os.Create(target)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
if _, err := io.Copy(f, file); err != nil {
|
|
return err
|
|
}
|
|
|
|
http.Redirect(w, r, "/notes"+strings.TrimPrefix(ft.HREF, "/attach"), http.StatusSeeOther)
|
|
return nil
|
|
}
|