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 }