mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
upload dialog API.
This commit is contained in:
parent
98dc08cba9
commit
2b3bb6e21a
@ -69,6 +69,7 @@ func (h *RoomHandler) Route(r chi.Router) {
|
|||||||
|
|
||||||
r.With(h.uploadMiddleware).Route("/upload", func(r chi.Router) {
|
r.With(h.uploadMiddleware).Route("/upload", func(r chi.Router) {
|
||||||
r.Post("/drop", h.uploadDrop)
|
r.Post("/drop", h.uploadDrop)
|
||||||
|
r.Post("/dialog", h.uploadDialog)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,3 +86,65 @@ func (h *RoomHandler) uploadDrop(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
utils.HttpSuccess(w)
|
utils.HttpSuccess(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (h *RoomHandler) uploadDialog(w http.ResponseWriter, r *http.Request) {
|
||||||
|
r.ParseMultipartForm(MAX_UPLOAD_SIZE)
|
||||||
|
|
||||||
|
if r.MultipartForm == nil {
|
||||||
|
utils.HttpBadRequest(w, "No MultipartForm received.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer r.MultipartForm.RemoveAll()
|
||||||
|
|
||||||
|
if !h.desktop.IsFileChooserDialogOpen() {
|
||||||
|
utils.HttpBadRequest(w, "Open file chooser dialog first.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
req_files := r.MultipartForm.File["files"]
|
||||||
|
if len(req_files) == 0 {
|
||||||
|
utils.HttpBadRequest(w, "No files received.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dir, err := ioutil.TempDir("", "neko-dialog-*")
|
||||||
|
if err != nil {
|
||||||
|
utils.HttpInternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, req_file := range req_files {
|
||||||
|
path := path.Join(dir, req_file.Filename)
|
||||||
|
|
||||||
|
srcFile, err := req_file.Open()
|
||||||
|
if err != nil {
|
||||||
|
utils.HttpInternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer srcFile.Close()
|
||||||
|
|
||||||
|
dstFile, err := os.OpenFile(path, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644)
|
||||||
|
if err != nil {
|
||||||
|
utils.HttpInternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
defer dstFile.Close()
|
||||||
|
|
||||||
|
_, err = io.Copy(dstFile, srcFile)
|
||||||
|
if err != nil {
|
||||||
|
utils.HttpInternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.desktop.HandleFileChooserDialog(dir); err != nil {
|
||||||
|
utils.HttpInternalServerError(w, "Unable to handle file chooser dialog.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.HttpSuccess(w)
|
||||||
|
}
|
||||||
|
58
internal/desktop/filechooser.go
Normal file
58
internal/desktop/filechooser.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package desktop
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (manager *DesktopManagerCtx) HandleFileChooserDialog(uri string) error {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
|
// TOOD: Use native API.
|
||||||
|
cmd := exec.Command(
|
||||||
|
"xdotool",
|
||||||
|
"search", "--name", "Open", "windowfocus",
|
||||||
|
"sleep", "0.2",
|
||||||
|
"key", "--clearmodifiers", "ctrl+l",
|
||||||
|
"type", "--args", "1", uri + "//",
|
||||||
|
"key", "--clearmodifiers", "Return",
|
||||||
|
"sleep", "1",
|
||||||
|
"key", "--clearmodifiers", "Down",
|
||||||
|
"key", "--clearmodifiers", "ctrl+a",
|
||||||
|
"key", "--clearmodifiers", "Return",
|
||||||
|
"sleep", "0.3",
|
||||||
|
)
|
||||||
|
|
||||||
|
_, err := cmd.Output()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (manager *DesktopManagerCtx) CloseFileChooserDialog() error {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
|
// TOOD: Use native API.
|
||||||
|
cmd := exec.Command(
|
||||||
|
"xdotool",
|
||||||
|
"search", "--name", "Open", "windowfocus",
|
||||||
|
"sleep", "0.2",
|
||||||
|
"key", "--clearmodifiers", "alt+f4",
|
||||||
|
)
|
||||||
|
|
||||||
|
_, err := cmd.Output()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (manager *DesktopManagerCtx) IsFileChooserDialogOpen() bool {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
|
||||||
|
// TOOD: Use native API.
|
||||||
|
cmd := exec.Command(
|
||||||
|
"xdotool",
|
||||||
|
"search", "--name", "Open", "windowfocus",
|
||||||
|
)
|
||||||
|
|
||||||
|
_, err := cmd.Output()
|
||||||
|
return err == nil
|
||||||
|
}
|
@ -66,4 +66,9 @@ type DesktopManager interface {
|
|||||||
|
|
||||||
// drop
|
// drop
|
||||||
DropFiles(x int, y int, files []string) bool
|
DropFiles(x int, y int, files []string) bool
|
||||||
|
|
||||||
|
// filechooser
|
||||||
|
HandleFileChooserDialog(uri string) error
|
||||||
|
CloseFileChooserDialog() error
|
||||||
|
IsFileChooserDialogOpen() bool
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user